尝试找出以下SQL命令:
你有2个表,mainTable和subTable。 mainTable由pkmainTable列组成,subTable由pksubTable,fkmainTable,bitVal1,bitVal2
组成我想找出mainTable中的每个条目,其中所有相应的( - > m.pkmainTable = s.fkmainTable)子表条目都没有(bitVal1 = true或bitVal2 = true)
我目前的尝试(在伪SQL代码中,它不起作用):
SELECT *
FROM mainTable as m
INNER JOIN subTable as s ON m.pkmainTable = s.fkmainTable
WHERE SUM(CASE WHEN s.bitVal1 = 1 then 1 else 0 end) = 0
OR SUM(CASE WHEN s.bitVal2 = 1 then 1 else 0 end) = 0
mainTable
pkmainTable<br>
1<br>
2<br>
3<br>
4<br>
子表
pksubTable | fkmainTable | bitVal1 | bitVal2<br>
1 | 1 | 1 | 1<br>
2 | 1 | 0 | 0<br>
3 | 1 | 0 | 1<br>
4 | 2 | 0 | 0<br>
5 | 2 | 0 | 1<br>
6 | 3 | 0 | 0<br>
7 | 3 | 1 | 0<br>
8 | 3 | 0 | 1<br>
9 | 4 | 0 | 0<br>
结果应该返回mainTable中pkmainTable = 2或4
的条目答案 0 :(得分:0)
对于聚合函数(SUM,COUNT等)的条件,您需要使用HAVING子句。但在这种情况下,它只会使事情过于复杂,NOT EXISTS函数应该可以正常工作 - 如果子查询返回零行,则返回true。例如:
SELECT *
FROM mainTable as m
WHERE NOT EXISTS (SELECT *
FROM subTable as s
WHERE m.pkmainTable = s.fkmainTable
AND (s.bitVal1 = 1 OR s.bitVal2 = 1))
以下是使用聚合函数的方法:
SELECT m.pkmainTable FROM mainTable as m
INNER JOIN subTable as s ON m.pkmainTable = s.fkmainTable
GROUP by m.pkmainTable
HAVING SUM(CASE WHEN s.bitVal1 = 1 then 1 else 0 end) = 0
OR SUM(CASE WHEN s.bitVal2 = 1 then 1 else 0 end) = 0
答案 1 :(得分:0)
尽管Mikhail的技术上正确答案,但您的规范声明结果集应包含mainTable中的行,其中subTable中相关行的 none 具有(bitVal1 = 1或bitVal2 = 1)
这与您的测试数据和样本输出不一致。对于mainTable值为2的子表中有两行,其中一行包含bitVal2 = 1,从而使其不符合您的样本输出。
除此之外,我还要建议Mikhail提到的NOT EXISTS解决方案,他在我调试你的螺旋测试用例时首先到达那里。
SELECT * FROM mainTable
WHERE NOT EXISTS (SELECT fkMainTable FROM subTable
WHERE fkMainTable = pkMainTable AND (bitVal1 = 1 OR bitVal2 = 1));