我有4个表表1——列:idTab2——列:id, Tab1Id表3——列:id, Tab2Id表4——columns: id, Tab3Id
可能有来自另一个表的相同id的多行。例如:相同的Tab1Id可以在Tab2中出现多次,相同的Tab3Id可以在Tab4中出现多次等
我现在想通过连接的表获得所有Tab1记录,在Tab4中没有任何行。
我能够得到所有在Tab4中有条目的Tab3,但是我如何将它们放在一个组中以知道Tab1中的哪些条目在Tab4中没有条目。
Tab1
+----+
| id |
+----+
| 1 |
+----+
| 2 |
+----+
Tab2
+----+--------+
| id | Tab1Id |
+----+--------+
| 10 | 1 |
+----+--------+
| 20 | 1 |
+----+--------+
| 30 | 2 |
+----+--------+
| 40 | 2 |
+----+--------+
Tab3
+----+--------+
| id | Tab2Id |
+----+--------+
| 100 | 10 |
+----+--------+
| 200 | 10 |
+----+--------+
| 300 | 20 |
+----+--------+
Tab4
+------+--------+
| id | Tab3Id |
+------+--------+
| 1000 | 100 |
因此,对于我的查询,我只想要Tab1中的id 2,因为Tab4中没有与此id对应的条目
单向:
SELECT t1.id
FROM Tab1 t1
WHERE id NOT IN ( SELECT t2.Tab1Id
FROM Tab2 t2
INNER JOIN Tab3 t3 on t3.Tab2Id=t2.id
INNER JOIN Tab4 t4 on t4.Tab3Id=t3.id
);
https://dbfiddle.uk/?rdbms=mysql_8.0&小提琴= 189 d2e246b781f28e18dc5f93e847e20
子查询将返回Tab2、Tab3和Tab4表中的匹配值,这些值将被NOT IN
子句过滤掉。
另一个选项是使用NOT EXISTS
SELECT t1.id
FROM Tab1 t1
WHERE NOT EXISTS ( SELECT 1
FROM Tab2 t2
INNER JOIN Tab3 t3 on t3.Tab2Id=t2.id
INNER JOIN Tab4 t4 on t4.Tab3Id=t3.id
WHERE t2.Tab1Id=t1.id
)
https://dbfiddle.uk/?rdbms=mysql_8.0&小提琴= 6 cde22a13c12c2c32f4860324ae0c92d