嵌套连接,其中一个表中没有值



我有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

最新更新