2011-02-28 64 views
1

我試圖找到客戶(客戶ID)在剩下的幾周內同時擁有1和4的情況。我使用下面的查詢:SQL Server 2008 - 與兩個條件都匹配的查詢

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 

此發現誰剩餘數週或4對而不是那些有都有1客戶。我是否需要修改我的加入來完成此項工作?

謝謝!

回答

3

這是一個relational division問題。通過聚集來解決這個問題的方法是

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 
+0

感謝您的答案和鏈接。我最喜歡使用聚合方法來處理查詢中執行的其他操作。 – Mike 2011-02-28 15:04:50

6

要認識到的關鍵是,從OrderItems永遠不會有一個行,其餘的ReWiningWeeks等於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 
+1

+1燁,你是對的 - 回答得太快,之前由於您使用的SQL 2008,你也可以使用的交叉點(一個大腦能夠處理的問題:-) – 2011-02-28 14:32:56

+0

我見過的幾個真實的世界時間是有用的)。 – ktharsis 2011-02-28 14:35:38