Sql-Server

簡單的 SQL,嵌入式選擇

  • October 29, 2018

我有一張帶有緯度/經度的郵政編碼表。不幸的是,它似乎沒有幾個郵政編碼。我想嘗試根據至少在該地區的其他郵政編碼來近似緯度/經度。

因此,對於不在我的數據庫中的郵政編碼 52733,我正在考慮採用“LIKE 5273%”的所有其他郵政編碼的平均緯度。

select ZipCode as z,
     (select AVG(Latitude) 
      from tlkp_ZipCodes 
      where ZipCode like LEFT(z, 4) + '%' ) 
from tlkp_ZipCodes

但這似乎不起作用。它說“z”是一個無效的列名。我該怎麼做呢?

您似乎想在標量子查詢的 OUTER 查詢中引用 ZipCode。您不能引用別名z,因為它只是在同一個 SELECT 子句中定義的。正確的方法是使用基列,但對錶進行不同的別名,以在列名前加上別名。

select a.ZipCode as z, 
 (select AVG(b.Latitude)
    from tlkp_ZipCodes b
   where b.ZipCode like LEFT(a.ZipCode, 4) + '%' ) AvgLatitude
from tlkp_ZipCodes a

如果您的 DBMS 支持視窗函式,您也可以使用它:

SELECT ZipCode AS z, 
      AVG(Latitude) OVER (PARTITION BY LEFT(ZipCode, 4)) AS AvgLatitude
FROM tlkp_ZipCodes AS a ;

在**SQL-Fiddle中測試**

引用自:https://dba.stackexchange.com/questions/27710