2014-02-05 151 views
0

我如何编写查询可找到具有相同订单行(详细信息)的订单?SQL查询查找具有相同订单行的订单

样本数据

表:订单

ORDER_ID 
-------- 
A 
B 
C 
D 

表:订单明细

OrderID ProductID 
------------------ 
A ProductX 
A ProductY 
A ProductZ 
B ProductX 
B ProductY 
C ProductZ 
D ProductX 
D ProductY 
D ProductZ 

现在我想通过ProductX,ProductY,ProductZ并取回AD

这可以在一个查询中完成吗?

+0

假设有是没有订单表。即使那么所需的结果可以得到礼仪... –

回答

1

也许这样的事情是你想要的?

SELECT DISTINCT Orders.OrderID 
FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID 
WHERE OrderDetails.ProductID IN ('ProductX', 'ProductY', 'ProductZ') 
GROUP BY Orders.OrderID 
HAVING COUNT(*) = 3 

另请注意,Order是保留关键字,不应作为表名使用。

+0

假设没有订单表..即使那么所需的结果可以得到礼... –

+0

@jpw,遇到问题与查询,这也会返回超过3种产品的记录。像'ProductX','ProductY','ProductZ','ProductA'一样。 – asolvent

0
SELECT OrderId FROM 
(SELECT DISTINCT o.OrderId, p.Product 
FROM Orders o 
INNER JOIN OrderDetails p 
ON o.OrderId = p .OrderId 
WHERE p.Product IN ('ProductX', 'ProductY', 'ProductZ')) tab 
GROUP BY OrderId 
HAVING COUNT(*) = 3 
0

试试这个

SELECT P.OrderID 
FROM Order1 P JOIN OrderDetails D ON 
      P.OrderID = D.OrderID 
WHERE P.OrderID IN (SELECT OrderID FROM OrderDetails WHERE ProductID IN ('ProductX', 'ProductY', 'ProductZ')) 
Having Count(P.OrderID)=3 
GROUP BY P.OrderID 

FIDDLE DEMO

0

我已经做了必要的事情,而无需使用Order表..

SELECT id from ProductT 
group by id 
having count(*)=3; 

SQL Fiddle