Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有所有匹配项的简单SQL选择_Sql_Tsql_Relational Division - Fatal编程技术网

具有所有匹配项的简单SQL选择

具有所有匹配项的简单SQL选择,sql,tsql,relational-division,Sql,Tsql,Relational Division,SQL问题:我的表有两列:ProductId和CatId 我想选择属于所有传入的CatIds的产品 例如,这是我的表格: ProductID        CatID _____________________ 1129                2 1129                3 1129                4 1130                2 1130                3 现在如果我通过2,3,4,结果应该是1129 如果我通过了2,3,

SQL问题:我的表有两列:
ProductId
CatId

我想选择属于所有传入的
CatId
s的产品

例如,这是我的表格:

ProductID        CatID
_____________________
1129                2
1129                3
1129                4
1130                2
1130                3
现在如果我通过
2,3,4
,结果应该是
1129

如果我通过了
2,3
,结果应该是
1130
(不是1129,因为它应该属于通过的所有CATID,不少于-不多于)

你知道如何做到这一点吗<带
中的code>无法工作<带有
中的code>将不起作用


谢谢。

诀窍是通过按productId分组,然后使用
have
以较小的类别子集筛选结果,查看产品所属的类别

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

您如何传递要匹配的ID?在表值参数中?关键是将加入列表的结果与未加入列表的结果进行比较。获取匹配且不为零的计数。现在的诀窍是写那个查询…不。。。正在尝试使用带有“IN”的简单“select”和“where”子句。。。不确定表值参数的事情(很抱歉,sql不是很好:()…
+1
用于添加具有所需结果的示例记录。我认为这将输出
计数
而不是
id
。您也可以将id添加到查询:)我认为这应该可以工作,感谢Fiddle演示。但我并没有完全理解最后一行:“COUNT(*)=2”我不能硬编码吗?它应该是动态的。你怎么想?@aDev-然后用你自己的能力来调整答案以适应你自己的发展限制???批评一个答案没有满足你在问题中没有提到的约束是有点不公平的。。。[例如,将搜索参数插入到表变量中,然后使用
WHERE CatID IN(从@params中选择id)
和COUNT(*)=(从@params中选择COUNT(*)
]@Dems。。。不知道你在这里是什么意思。。。我没有批评。。。我只是问。。。如果感觉不好,我很抱歉…:)嘿让它工作起来。。。在我的测试中。。。但我想我现在可以实施了。。。谢谢大家……:)
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