2012-11-13 32 views
2

SQL匹配的問題:我有兩個列的表:ProductIdCatId簡單的SQL選擇所有

我要選擇屬於所有CatId S中傳遞的產品。

例如,這是我的表:

ProductID        CatID 
_____________________ 
1129                2 
1129                3 
1129                4 
1130                2 
1130                3 

現在,如果我通過2,3,4結果應該是1129

如果我通過2,3結果應該是1130(不是1129,因爲它應該屬於所有通過CatIds不會少 - 沒有更多)

不知道如何可以做到這一點? INAND無法正常工作。 INOR將不起作用。

謝謝。

+0

你是如何通過ID匹配?在一個表值參數? –

+0

關鍵是比較加入您的列表的結果和未加入列表的結果。獲得匹配的數量並且不爲零。現在的訣竅是寫這個查詢... –

+0

不......正在嘗試簡單的'選擇'和'where'子句與'IN'...不確定關於表值參數的事情(對不起,並不是很擅長sql :()... –

回答

3
SELECT ProductID 
FROM Table1 a 
WHERE CatID IN (2,3) 
GROUP BY ProductID 
HAVING COUNT(*) = 
     (
      SELECT COUNT(*) 
      FROM table1 b 
      WHERE b.ProductID = a.ProductID 
     ) AND 
     COUNT(*) = 2 
+0

我認爲這應該工作,感謝小提琴演示的事情。但我並沒有完全明白你的最後一行:「COUNT(*)= 2」我不能硬編碼嗎?它應該是動態的。你怎麼看? –

+2

@aDev - 然後用你自己的能力來適應你自己的發展約束?批評答案不符合您在問題中未提及的約束是有點不公平的...... * [例如,將搜索參數插入到表變量中,然後使用'WHERE CatID IN(SELECT id FROM @ params)'和'AND COUNT(*)=(SELECT COUNT(*)FROM @params)'] * – MatBailie

+1

@Dems ...不知道你在這裏的意思...我沒有批評...只是問...對不起,如果它感覺不好... :) –

-1

訣竅是看到多少產品所屬的類別的,通過按ProductID對分組,然後使用HAVING過濾與類別

SELECT ProductID, COUNT(*) as c FROM table WHERE CatID IN(2,3,4) GROUP BY ProductID HAVING c = 3 
+0

我認爲這將輸出'count' *而不是'id'。 –

+0

您可以將該ID添加到查詢中:) –