如何从两张包含重复值的表中提取唯一值并生成新表?
解决两张表提取唯一值并生成新表的问题
嘿,你的思路已经对了一半啦!目前的查询只能拿到表1中存在但表2没有的值(也就是示例里的104),但还漏掉了表2中存在但表1没有的105。咱们把这两部分结果合并起来,就能得到你要的表3了。
方案一:基于LEFT JOIN扩展(贴合你现有逻辑)
这种方法在你原查询的基础上,补充表2的独有值,用UNION合并两个结果集:
-- 获取表1独有的值 SELECT `Table 1 data`.col1 FROM `Table 1 data` LEFT JOIN `Table 2 data` ON `Table 1 data`.col1 = `Table 2 data`.col1 WHERE `Table 2 data`.col1 IS NULL UNION -- 获取表2独有的值 SELECT `Table 2 data`.col1 FROM `Table 2 data` LEFT JOIN `Table 1 data` ON `Table 2 data`.col1 = `Table 1 data`.col1 WHERE `Table 1 data`.col1 IS NULL;
方案二:用NOT EXISTS(逻辑更直观)
如果觉得JOIN的写法有点绕,NOT EXISTS的逻辑更直白——直接筛选出在另一张表中完全不存在的值:
SELECT col1 FROM `Table 1 data` WHERE NOT EXISTS ( SELECT 1 FROM `Table 2 data` WHERE `Table 2 data`.col1 = `Table 1 data`.col1 ) UNION SELECT col1 FROM `Table 2 data` WHERE NOT EXISTS ( SELECT 1 FROM `Table 1 data` WHERE `Table 1 data`.col1 = `Table 2 data`.col1 );
直接生成新表3的完整写法
如果要把结果直接插入到新表中,只需在查询前加上INSERT INTO语句:
INSERT INTO `Table 3` (col1) SELECT col1 FROM `Table 1 data` WHERE NOT EXISTS ( SELECT 1 FROM `Table 2 data` WHERE `Table 2 data`.col1 = `Table 1 data`.col1 ) UNION ALL SELECT col1 FROM `Table 2 data` WHERE NOT EXISTS ( SELECT 1 FROM `Table 1 data` WHERE `Table 1 data`.col1 = `Table 2 data`.col1 );
这里用UNION ALL代替UNION,因为两边的结果本身不会有重复,执行效率会更高。
内容的提问来源于stack exchange,提问作者Micheal
相关产品推荐
相关产品推荐

