Sql server SQL Server 2008-匹配这两个条件的查询
我正在尝试查找在剩余的几周内同时具有1和4的客户(CustomerID)。我正在使用以下查询: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
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(这是我见过的为数不多的有用的真实世界中的一次)。感谢回答和链接。我喜欢聚合方法最适合用于我在查询中执行的其他操作。感谢回答和链接。我喜欢聚合方法最适合用于我在查询中执行的其他操作。