Sql 计算具有多个对应项的联接表中的值的数量

Sql 计算具有多个对应项的联接表中的值的数量,sql,Sql,正在尝试找出以下SQL命令: 您有两个表,mainTable和subTable。mainTable由pkmainTable列组成,subTable由pksubTable、fkmainTable、bitVal1、bitVal2组成 我想计算mainTable中的每个条目,其中在所有相应的(->m.pkmainTable=s.fkmainTable)子表条目中没有一个条目(bitVal1=true或bitVal2=true) 我当前的尝试(在伪SQL代码中,它不起作用): 示例表: 主表 pkmai

正在尝试找出以下SQL命令:

您有两个表,mainTable和subTable。mainTable由pkmainTable列组成,subTable由pksubTable、fkmainTable、bitVal1、bitVal2组成

我想计算mainTable中的每个条目,其中在所有相应的(->m.pkmainTable=s.fkmainTable)子表条目中没有一个条目(bitVal1=true或bitVal2=true)

我当前的尝试(在伪SQL代码中,它不起作用):

示例表: 主表

pkmainTable<br>
1<br>
2<br>
3<br>
4<br>
pkmainTable
1
2
3
4
子表

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>
pksubTable | fkmainTable | bitVal1 | bitVal2
1 | 1 | 1 | 1
2 | 1 | 0 | 0
3 | 1 | 0 | 1
4 | 2 | 0 | 0
5 | 2 | 0 | 1
6 | 3 | 0 | 0
7 | 3 | 1 | 0
8|3|0|1
9 | 4 | 0 | 0

结果应该返回mainTable中的条目,其中pkmainTable=2或4

,以了解需要使用HAVING子句的聚合函数(SUM、COUNT等)的条件。但在这种情况下,它将使事情变得过于复杂,notexists函数应该可以正常工作——如果子查询返回零行,它将返回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

尽管Mikhail的回答在技术上是正确的,但您的规范规定,结果集应该包含mainTable中的行,其中子表中的相关行中的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));

将预期结果也显示为格式化文本!您使用的是哪种数据库管理系统?博士后?神谕
SELECT * FROM mainTable
WHERE NOT EXISTS (SELECT fkMainTable FROM subTable 
WHERE fkMainTable = pkMainTable AND (bitVal1 = 1 OR bitVal2 = 1));