SQL查询:筛选关联不存在Object记录的Problem数据
解决方案
要查询出关联Tasks指向的Object不存在于Objects表中的Problems数据,有两种常用的实现方式:
方法一:使用LEFT JOIN + IS NULL判断
SELECT DISTINCT p.* FROM Problems p INNER JOIN Tasks t ON p.TaskId = t.Id LEFT JOIN Objects o ON t.objectID = o.Id WHERE o.Id IS NULL
- 逻辑说明:先通过
INNER JOIN关联Problems和对应的Tasks,再用LEFT JOIN关联Tasks对应的Objects记录;如果关联后Objects的主键Id为NULL,说明该Tasks指向的Object在Objects表中不存在;DISTINCT用来避免同一个Problem因关联多个无效Tasks而重复输出。
方法二:使用NOT EXISTS子查询
SELECT p.* FROM Problems p WHERE EXISTS ( SELECT 1 FROM Tasks t WHERE t.Id = p.TaskId AND NOT EXISTS ( SELECT 1 FROM Objects o WHERE o.Id = t.objectID ) )
- 逻辑说明:外层查询筛选存在符合条件Tasks的Problems——即该Tasks属于当前Problem,且该Tasks指向的Object在Objects表中不存在。这种写法无需去重,查询逻辑更直观。
内容的提问来源于stack exchange,提问作者Adam Varhegyi
相关产品推荐
相关产品推荐

