如何在WHERE中使用子查询? (AdventureWorks)

时间:2020-10-29 21:05:41

标签: sql sql-server count subquery adventureworks

我在做什么错?我需要确保“ OrderCount”列中的值仅显示大于20的值。请注意:在这种情况下,不允许使用JOIN。

SELECT FirstName, LastName, (SELECT COUNT(SalesOrderID)
                             FROM SalesOrderHeader
                             WHERE SalesOrderHeader.ContactID = Contact.ContactID) AS OrderCount
FROM Contact
WHERE COUNT(SalesOrderID) = (SELECT COUNT(SalesOrderID)
                             FROM SalesOrderHeader
                             WHERE COUNT(SalesOrderID) > 20

3 个答案:

答案 0 :(得分:1)

基本上,您还需要在where子句中关联子查询-您的订单计算所有订单,而不仅仅是相关客户的订单。

但是子查询似乎更简单:

SELECT *
FROM (
    SELECT c.FirstName, c.LastName, 
        (
            SELECT COUNT(s.SalesOrderID)
            FROM SalesOrderHeader s
            WHERE s.ContactID = c.ContactID
        ) AS OrderCount
    FROM Contact c
) t
where OrderCount > 20

请注意:在这种情况下,我不允许使用JOIN。

这确实是一个人为的例子。在现实生活中,使用外部聚合和having子句的连接或横向连接会更合适:

SELECT c.FirstName, c.LastName, o.OrderCount
FROM Contact c
CROSS APPLY (
    SELECT COUNT(s.SalesOrderID) as OrderCount
    FROM SalesOrderHeader s
    WHERE s.ContactID = c.ContactID
) AS o
where o.OrderCount > 20

答案 1 :(得分:1)

SELECT FirstName, LastName, (SELECT COUNT(SalesOrderID)
                             FROM SalesOrderHeader
                             WHERE SalesOrderHeader.ContactID = Contact.ContactID) AS OrderCount
FROM   Contact
WHERE  Contact.ContactID in (SELECT 
                              SalesOrderHeader.ContactID
                             FROM SalesOrderHeader
                             Group by 
                              SalesOrderHeader.ContactID
                             Having COUNT(*) > 20

答案 2 :(得分:0)

这里的问题不是子查询,而是引起问题的聚合函数(在这种情况下为COUNT)。您不能在FROM的{​​{1}}中放置引用表的聚合函数,而在WHERE中引用它。

我认为您也可以将其压缩为不需要子查询:

HAVING