2010-02-10 137 views
0

考慮訂單。訂單將包含一個或多個訂單項。每個訂單項都適用於特定的產品。如何從兩個表中的結果中獲得一個ID

給定一個過濾表與幾個產品,我怎麼會得到至少有所有列在第二個表中的產品的訂單ID?

table Orders(
    OrderId int 
) 

table LineItems (
    OrderId int, 
    LineItemId int, 
    ProductId int 
) 

table Filter (
    ProductId int 
) 

數據

Orders 
OrderId 
-------- 
1 
2 
3 


LineItems 
OrderId LineItemId ProductId 
------- ---------- --------- 
1   1   401 
1   2   502 
2   3   401 
3   4   401 
3   5   603 
3   6   714 

Filter 
ProductId 
--------- 
401 
603 
查詢

期望的結果: 的OrderId:3

回答

1

davek已關閉。你首先要縮小你的結果設置爲僅包含項目信息進行過濾表,然後通過計數得到你的結果:

select orderId 
from lineitems 
where ProductId 
    in (select productId from filter) 
group by orderid 
having count(distinct productid) 
    = (select count(distinct productid) from filter) 

或使用,而不是加入的:

select orderId 
from lineitems li 
    inner join filter f on li.productId = f.productid 
group by orderid 
having count(distinct li.productid) 
    = (select count(distinct productid) from filter) 

我通過跑了兩質量保證和他們執行相同的,但有一個體面的數據集,我假設加入將表現更好。

+0

是的我通常喜歡加入子選擇我自己。謝謝! – NotMe 2010-02-10 22:20:11

+0

標記此爲最完整的答案。因爲他們得出了同樣的結論,所以我都贊同。謝謝大家。 – NotMe 2010-02-11 03:09:42

1
select orderid 
from lineitems 
group by orderid 
having count(distinct productid) 
    >= (select count(distinct productid) from filter) 

可能工作(不知道的having來看,由於我不能測試它我的家盒子)。

+0

這看起來像它會發現訂單具有相同的*編號*的產品,不一定是相同的產品.. – NotMe 2010-02-10 21:53:05

相關問題