如何将EXCEPT与UNION ALL组合的表差异查询结果存入临时表
插入查询结果到表的实现方案
方案1:提前建表后插入
如果已经提前创建好结构与table1/table2完全一致的目标表(临时表/普通表均可),直接在外层增加INSERT INTO语句即可:
-- 示例:提前创建临时表,字段结构需与table1、table2完全匹配 CREATE TEMP TABLE table_diff ( id INT, content VARCHAR(100), create_time DATETIME -- 其余字段按需补充,和table1/table2完全对齐 ); -- 插入差异查询结果 INSERT INTO table_diff ( SELECT * FROM table1 EXCEPT SELECT * FROM table2 ) UNION ALL ( SELECT * FROM table2 EXCEPT SELECT * FROM table1 );
方案2:一步生成表(CTAS语法)
绝大多数主流数据库支持CREATE TABLE AS SELECT语法,无需提前定义表结构,会自动匹配查询结果的字段类型、字段名,一步完成建表+数据插入:
-- 生成临时表,去掉TEMP关键字即可生成普通持久表 CREATE TEMP TABLE table_diff AS ( SELECT * FROM table1 EXCEPT SELECT * FROM table2 ) UNION ALL ( SELECT * FROM table2 EXCEPT SELECT * FROM table1 );
注意事项
- 必须保证
table1和table2的字段数量、字段顺序、对应字段的类型完全一致,否则EXCEPT语法会报错 - SQL Server环境下临时表命名需加
#前缀,写法调整为CREATE TABLE #table_diff AS ...即可 - 你当前使用的差异查询原生支持NULL值的等值匹配,无需额外调整逻辑
内容的提问来源于stack exchange,提问作者John Stud
相关产品推荐
相关产品推荐

