使用多个相应条目计算连接表中的值的数量

时间:2017-03-28 10:04:00

标签: sql

尝试找出以下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

的条目

2 个答案:

答案 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));