2012-11-13 34 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添加到查询中:) –