如何修正自左连接tasks表的SQL查询以返回所有验证任务
修正LEFT JOIN查询以保留无对应导入任务的验证任务
问题原因
你的查询中,imp.type='import'被放在了WHERE子句里。对于没有对应导入任务的验证任务(比如id=7的记录),LEFT JOIN后imp表的所有字段都是NULL,NULL='import'的判断结果不成立,因此这部分记录被WHERE条件过滤掉,导致预期的记录未返回。
修正后的SQL
SELECT val.id AS val_task, imp.id AS imp_task, val.doc_id AS doc_id FROM tasks val LEFT JOIN tasks imp ON val.doc_id = imp.doc_id AND imp.type = 'import' -- 将imp的类型条件移到JOIN的ON子句中 WHERE val.type = 'validation' -- 仅筛选验证任务
说明
- 将
imp.type='import'从WHERE子句移到LEFT JOIN的ON子句中,这样在关联时只会匹配类型为import的任务,没有匹配到的情况下imp字段会保留NULL,不会被过滤。 WHERE val.type='validation'确保我们只获取所有验证任务,符合需求中"显示所有验证任务"的要求。
验证结果
执行上述查询后,会得到你预期的结果:
val_task | imp_task | doc_id ---------|----------|------- 2 | 3 | 7 5 | 6 | 8 7 | NULL | 9
内容的提问来源于stack exchange,提问作者Arevik
相关产品推荐
相关产品推荐

