2013-02-23 74 views
1

我有以下SELECT語句。SQL Server選擇別名與IN語句不起作用

SELECT t.ID, 
     t.SiteID, 
     t.SpareID, 
     t.SpareLocationID, 
     t.Qty, 
     t.IsDefault 
    FROM TrainingDB.dbo.LocationsPerSpare t 
WHERE t.SpareID IN 
     (SELECT s.SpareID 
      FROM TrainingDB.dbo.LocationsPerSpare s 
     WHERE s.SpareLocationID = t.SpareLocationID 
      AND s.SpareID = t.SpareID 
     GROUP BY s.SpareID 
     HAVING COUNT(CONVERT(VARCHAR(36), s.SpareID)) > 2) 
ORDER BY t.SpareID 

如果我執行該腳本,它返回NULL。但是,如果我刪除如下所示的t.別名,它將正常運行。

SELECT ID, 
     SiteID, 
     SpareID, 
     SpareLocationID, 
     Qty, 
     IsDefault 
    FROM TrainingDB.dbo.LocationsPerSpare 
WHERE SpareID IN 
     (SELECT s.SpareID 
      FROM TrainingDB.dbo.LocationsPerSpare s 
     WHERE s.SpareLocationID = SpareLocationID 
      AND s.SpareID = SpareID 
     GROUP BY s.SpareID 
     HAVING COUNT(CONVERT(VARCHAR(36), s.SpareID)) > 2) 
ORDER BY SpareID 

我覺得這很奇怪。有任何想法嗎?

回答

1

您需要從子查詢中刪除

AND s.SpareID = t.SpareID 

。當SpareID尚未有值時,您正在使用子查詢過濾主查詢中SpareID的值。

+0

此外,我會補充說,第二個查詢工作的原因是's.SpareID = SpareID'本質上是'1 = 1'。 SpareLocationID也一樣。當然他們等同。 – 2013-02-23 20:24:24

+0

關閉。刪除s.SpareLocationID = t.SpareLocationID的作品。感謝您的答覆。令人費解的事情是,沒有「t」。別名,它工作正常。 – 2013-02-23 20:28:49

+0

謝謝Nathan。我更頻繁地使用Oracle,並且我沒有這些問題。就像你說的那樣,別名不會暗示1 = 1。但那是有用的知道。 – 2013-02-23 20:31:57

0

順便問一下,你也可以重寫此查詢沒有加入,利用窗口函數代替:

select lps.ID, lps.SiteID, lps.SpareID, lps.SpareLocationID, 
     lps.Qty, lps.IsDefault 
from (select lps.*, 
      count(*) over (partition by spareId) as SpareCnt 
     from TrainingDB.dbo.LocationsPerSpare lps 
    ) lps 
where SpareCnt > 2 

你需要的別名,是因爲在一個子查詢中的非混淆列在最近的分配表的原因參考。所以,

where s.SpareID = t.SpareID 

比較外部表引用和內部引用的SpareId。

where s.SpareID = SpareID 

首先確定SpareID來自哪個表。它匹配內部子查詢中的列,因此它使用該列。表達式是等效於:

where s.SpareID = s.SpareId 

最後,的convertcount用戶是完全不必要的。 Count僅計算非NULL值的數量,並且在轉換爲字符串時不會更改。

例如,當我測試此代碼,它工作正常:

declare @t uniqueidentifier = newid(); 

select count(distinct t) 
from (select @t as t) v 

雖然,有趣的是,這個代碼不上SQLFiddle工作。但是存在錯誤@t未定義,這是不相關的。

+0

非常有趣的戈登,謝謝你的迴應。但是,SpareID是唯一標識符,我收到一條錯誤消息,迫使我使用CONVERT。 – 2013-02-24 14:11:14