具有所有匹配项的简单SQL选择
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,
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