2011-01-06 73 views
0

我會嘗試用類似但更簡單的問題來解釋我的問題。假設我正在爲圖書館編寫軟件,該圖書館的表格爲Patron s和Book s。此外,它還有一個CheckOuts表,它將Patron s與他們已檢出的任何Book s(每行1個)相關聯。TSQL聚合函數產生一個是或否的標誌

我使用的是MSSQL 2005,需要構建一個包含兩列,PatronIDHasBook一個視圖或存儲過程,這需要動態生成的:1,如果顧客有一個或多個書籤出,否則爲0 。

這是我在寫一個查詢第一次嘗試這樣做:

SELECT PatronID, MIN((SELECT 1, COUNT(BookID) FROM CheckOuts WHERE CheckOuts.PatronID = Patrons.PatronID)) AS HasBook 
      FROM Patrons 

我收到的錯誤是:

不能對包含 的表達式執行聚合函數 聚合或子查詢。

我是一個非常新的SQL用戶,所以如果這個查詢讓你感到畏縮,我會真誠地感謝你想給的任何建議。我對「正確」的方式非常感興趣。

+0

如果一本書沒有簽出,那麼`CheckOuts`表將沒有行匹配`Book`,對吧?同樣,如果顧客沒有書,「CheckOuts」表將沒有匹配的「顧客」? – Matthew 2011-01-06 18:56:23

回答

2

好吧,如果你只是想知道,如果PatronId有任何檢查,你可以做到以下幾點:

SELECT PatronID, CASE WHEN B.PatronId IS NOT NULL THEN 1 ELSE 0 END AS HasBook 
FROM Patrons A 
LEFT JOIN (SELECT PatronId FROM CheckOuts GROUP BY PatronId) B 
ON A.PatronId = B.PatronId 
0

試試這個:

SELECT a.PatronID, CASE b.PatronID WHEN NULL THEN 0 ELSE 1 END 
FROM Patrons a 
LEFT OUTER JOIN Patrons b ON b.PatronID = a.PatronID AND EXISTS (SELECT * FROM CheckOuts c WHERE c.PatronID = b.PatronID) 

編輯:Lamak的解決方案,使用派生表,可能會比我的好。他的速度可能更快。