2015-04-04 54 views
0
SELECT * 
FROM Book b 
WHERE b.book_id IN (SELECT DISTINCT(c.book_id) 
        FROM Copy c 
        WHERE c.copy_id IN (SELECT copy_id 
             FROM Loan 
             WHERE Datediff(DAY, Getdate() - 180, loan_date) > 180) 
        GROUP BY c.copy_id 
        HAVING Count(copy_id) > 10) 

當我運行此查詢時,出現錯誤。列在選擇列表中無效

「Column'Copy.Book_id'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。」

+0

的[?什麼是「無效,未包含在聚合函數」消息的意思(可能重複的HTTP ://stackoverflow.com/questions/18258704/what-does-the-invalid-not-contained-in-either-an-aggregate-function-message-m) – Tanner 2015-04-29 13:38:13

回答

0

當你想有一個字段select後在select語句group by一部分,你應該group by太后加上它的名稱和不使用distinct關鍵字,我認爲你需要像這樣的代碼:

SELECT c.book_id 
FROM Copy c 
WHERE c.copy_id IN (SELECT copy_id 
       FROM Loan 
       WHERE Datediff(DAY, Getdate() - 180, loan_date) > 180) 
GROUP BY c.book_id 
HAVING Count(copy_id) > 10 
0

您正在按c.copy_id分組,但您想選擇c.book_id。這是無效的。您可以從以下考慮一個選項:

  • group byc.book_id
  • group byc.book_id除了c.copy_id
  • 沒有在內部查詢
  • selectc.copy_id使用group by和外部使用它選擇以及

我相信第一個選項在這種情況下最有意義。

0

導致錯誤的問題是,您在子查詢中的錯誤列上分組,它應該是b.book_id

然後,我認爲你是datediff比較可能有錯誤的順序日期(但這取決於你的意圖,我可能誤解了你想要做的)。

所以與變化也許此查詢可能是你在找什麼:

SELECT * FROM Book b 
WHERE b.Book_Id IN (
    SELECT c.Book_id 
    FROM Copy c 
    JOIN Loan l ON c.copy_id = l.copy_id 
    WHERE DATEDIFF(DAY, Loan_date, getdate()-180) > 180 
    GROUP BY c.Book_Id 
    HAVING COUNT(l.Copy_Id) > 10 
)