Sql-Server

為什麼我需要使用子查詢來過濾分組選擇?

  • March 4, 2013

如果我這樣做——

SELECT dv.Name
     ,MAX(hb.[DateEntered]) as DE
FROM 
   [Devices] as dv
   INNER JOIN 
   [Heartbeats] as hb ON hb.DeviceID = dv.ID
WHERE DE < '2013-03-04'
GROUP BY dv.Name

我得到這個錯誤 -

消息 207,級別 16,狀態 1,第 17 行無效的列名稱“DE”。

如果我這樣做——

SELECT Name, DE FROM (
   SELECT dv.Name
         ,MAX(hb.[DateEntered]) as DE
   FROM 
       [Devices] as dv
       INNER JOIN 
       [Heartbeats] as hb ON hb.DeviceID = dv.ID
   GROUP BY dv.Name
) as tmp WHERE tmp.DE < '2013-03-04'

它按預期工作。

有人可以解釋為什麼我需要將我的主查詢嵌套為子查詢來限制我的數據集嗎?

另外,是否有更好的方法來實現這裡的目標?從一個表中檢索所有記錄,以及按[DateEntered]降序排列的單個“頂部”相關記錄?

您不能在WHERE子句中引用別名 - 這只是因為 SQL Server 解析語句的順序。

在這里和 StackOverflow 上對此進行了很多討論。提供一些背景的幾個例子:

https://dba.stackexchange.com/questions/19762/why-is-the-select-clause-listed-first/

為什麼以不允許在大多數子句中使用列別名的方式解析查詢?

另一種選擇是:

SELECT dv.Name
     ,MAX(hb.[DateEntered]) as DE
FROM 
   [Devices] as dv
   INNER JOIN 
   [Heartbeats] as hb ON hb.DeviceID = dv.ID
GROUP BY dv.Name
HAVING MAX(hb.[DateEntered]) < '20130304';

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