Sql server SQL Server 2008-匹配这两个条件的查询

Sql server SQL Server 2008-匹配这两个条件的查询,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在尝试查找在剩余的几周内同时具有1和4的客户(CustomerID)。我正在使用以下查询: SELECT o.CustomerID, oi.RemainingWeeks FROM Orders o INNER JOIN OrderItems oi ON o.OrderID = oi.OrderID WHERE (oi.OrderItemStatusID = 1) AND (oi.RemainingWeeks IN (1, 4)) ORDER BY o.Cust

我正在尝试查找在剩余的几周内同时具有1和4的客户(CustomerID)。我正在使用以下查询:

SELECT  o.CustomerID, oi.RemainingWeeks
FROM    Orders o INNER JOIN
        OrderItems oi ON o.OrderID = oi.OrderID 
WHERE   (oi.OrderItemStatusID = 1) AND (oi.RemainingWeeks IN (1, 4)) 
ORDER BY o.CustomerID, oi.RemainingWeeks
这会发现在剩余的几周内有1个或4个客户,但没有同时拥有这两个的客户。我是否需要修改我的联接以使其工作


谢谢

要意识到的关键是,
OrderItems
中不会有一行剩余周数同时等于1和4。因此,您需要以某种方式涉及多行。您可以通过聚合或仅执行第二次联接来实现这一点:

SELECT  o.CustomerID, oi1.RemainingWeeks,oi2.RemainingWeeks
FROM    Orders o INNER JOIN
        OrderItems oi1 ON o.OrderID = oi1.OrderID INNER JOIN
        OrderItems oi2 ON o.OrderID = oi2.OrderID
WHERE   (oi1.OrderItemStatusID = 1) AND (oi1.RemainingWeeks =1) AND
        (oi2.OrderItemStatusID = 1) AND (oi2.RemainingWeeks =4) 
ORDER BY
     o.CustomerID, oi1.RemainingWeeks,oi2.RemainingWeeks

要意识到的关键是,
OrderItems
中不会有一行剩余周数同时等于1和4。因此,您需要以某种方式涉及多行。您可以通过聚合或仅执行第二次联接来实现这一点:

SELECT  o.CustomerID, oi1.RemainingWeeks,oi2.RemainingWeeks
FROM    Orders o INNER JOIN
        OrderItems oi1 ON o.OrderID = oi1.OrderID INNER JOIN
        OrderItems oi2 ON o.OrderID = oi2.OrderID
WHERE   (oi1.OrderItemStatusID = 1) AND (oi1.RemainingWeeks =1) AND
        (oi2.OrderItemStatusID = 1) AND (oi2.RemainingWeeks =4) 
ORDER BY
     o.CustomerID, oi1.RemainingWeeks,oi2.RemainingWeeks
这是一个问题。通过聚合解决它的方法是

SELECT  o.CustomerID
FROM    Orders o INNER JOIN
        OrderItems oi ON o.OrderID = oi.OrderID 
WHERE   (oi.OrderItemStatusID = 1) AND (oi.RemainingWeeks IN (1, 4)) 
GROUP BY o.CustomerID
HAVING COUNT(DISTINCT oi.RemainingWeeks) = 2
ORDER BY o.CustomerID
这是一个问题。通过聚合解决它的方法是

SELECT  o.CustomerID
FROM    Orders o INNER JOIN
        OrderItems oi ON o.OrderID = oi.OrderID 
WHERE   (oi.OrderItemStatusID = 1) AND (oi.RemainingWeeks IN (1, 4)) 
GROUP BY o.CustomerID
HAVING COUNT(DISTINCT oi.RemainingWeeks) = 2
ORDER BY o.CustomerID

+1是的,你是对的-在大脑处理问题之前回答得太快:-)既然你在使用SQL 2008,你也可以使用INTERSECT(这是我见过的为数不多的几次使用它的真实世界)。+1是的,你是对的-在大脑处理问题之前回答得太快:-)既然你在使用SQL 2008,你也可以使用INTERSECT(这是我见过的为数不多的有用的真实世界中的一次)。感谢回答和链接。我喜欢聚合方法最适合用于我在查询中执行的其他操作。感谢回答和链接。我喜欢聚合方法最适合用于我在查询中执行的其他操作。