SQL两表对比查询:如何修改左连接语句新增仅表1存在值的标识
问题根因
你当前的写法相当于把LEFT JOIN变成了内连接:LEFT JOIN后右表eg_table2未匹配到的行所有字段都是NULL,你把eg_table2.CCI_PROJECT_ID LIKE '%ARG2%'写在WHERE子句中时,NULL做模糊匹配的结果为非真,这些左表存在、右表无匹配的行就会被直接过滤。
调整方案
- 把右表的过滤条件从
WHERE子句移到LEFT JOIN的ON关联条件中,保证左表符合part_id筛选条件的行全部保留 - 新增标识字段,通过判断右表非空字段(比如关联键
PRODNO)是否为NULL,标记数据是否同时存在于表2
修改后的SQL代码
SELECT eg_table1.*, eg_table2.*, CASE WHEN eg_table2.PRODNO IS NOT NULL THEN 1 ELSE 0 END AS is_exist_in_table2 FROM eg_table1 LEFT JOIN eg_table2 ON eg_table1.part_id = eg_table2.PRODNO AND eg_table2.CCI_PROJECT_ID LIKE '%ARG2%' WHERE eg_table1.part_id LIKE "%ARG1%"
逻辑说明
- 标识字段
is_exist_in_table2返回1代表该行数据同时存在于两个表,返回0代表该行仅存在eg_table1、eg_table2无匹配 - 右表的过滤条件放在
ON子句中时,只会过滤右表的匹配行,不会过滤左表的合格数据,左表所有符合part_id LIKE "%ARG1%"的行都会被返回
内容的提问来源于stack exchange,提问作者Lucas Brodersen
相关产品推荐
相关产品推荐

