求MySQL查询语句:筛选两表中完全非重复的字段值
解决方案:筛选两张表中仅单侧存在的值
问题说明
现有两张表:
- 表1(
table1)包含字段ColumnA - 表2(
table2)包含字段ColumnB
原始数据:
| ColumnA | ColumnB |
|---|---|
| apple | apple |
| kiwi | x |
| banana | y |
| berry | z |
需求:排除同时存在于ColumnA和ColumnB中的值(比如apple),仅保留只在其中一个字段出现的值,预期结果:
| value |
|---|
| kiwi |
| banana |
| berry |
| x |
| y |
| z |
实现查询
方法1:使用NOT IN + UNION ALL
-- 选取表1中独有的值 SELECT ColumnA AS value FROM table1 WHERE ColumnA NOT IN (SELECT ColumnB FROM table2) UNION ALL -- 选取表2中独有的值 SELECT ColumnB AS value FROM table2 WHERE ColumnB NOT IN (SELECT ColumnA FROM table1);
方法2:使用NOT EXISTS + UNION ALL(性能更优)
当数据量较大时,NOT EXISTS的执行效率通常比NOT IN更高:
SELECT ColumnA AS value FROM table1 t1 WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.ColumnB = t1.ColumnA) UNION ALL SELECT ColumnB AS value FROM table2 t2 WHERE NOT EXISTS (SELECT 1 FROM table1 t1 WHERE t1.ColumnA = t2.ColumnB);
逻辑说明
UNION ALL用于合并两个独立查询的结果,不会自动去重(两个查询的结果无重叠,无需去重)- 第一个查询筛选出仅在
table1.ColumnA中存在、但在table2.ColumnB中不存在的值 - 第二个查询筛选出仅在
table2.ColumnB中存在、但在table1.ColumnA中不存在的值 - 最终结果完全排除了在两个字段中都出现的重复值,符合需求
内容的提问来源于stack exchange,提问作者waleed hassan
相关产品推荐
相关产品推荐

