列在选择列表中无效

问题描述:

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 ://*.com/questions/18258704/what-does-the-invalid-not-contained-in-either-an-aggregate-function-message-m) – Tanner 2015-04-29 13:38:13

当你想有一个字段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 

您正在按c.copy_id分组,但您想选择c.book_id。这是无效的。您可以从以下考虑一个选项:

  • group byc.book_id
  • group byc.book_id除了c.copy_id
  • 没有在内部查询
  • selectc.copy_id使用group by和外部使用它选择以及

我相信第一个选项在这种情况下最有意义。

导致错误的问题是,您在子查询中的错误列上分组,它应该是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 
)