技术需求:对比tbl1与tbl2数据表数据并整合至新表tbl_new
数据表对比合并解决方案
没问题,我来帮你实现把tbl01和tbl02的数据对比后合并到tbl_new的需求!
核心思路
我们需要保留两张表中所有的物料组(mat_group)记录,同时展示各自的价格,所以用**全外连接(FULL OUTER JOIN)**是最合适的——它能同时包含只在tbl01存在、只在tbl02存在,以及两边都存在的mat_group。
实现SQL代码
下面的语句会直接创建tbl_new并填充对比后的数据:
CREATE TABLE tbl_new AS SELECT t1.price AS t1_price, t2.price AS t2_price, -- 取非空的mat_group,确保总有值 COALESCE(t1.mat_group, t2.mat_group) AS mat_group, -- 同理,取非空的major字段 COALESCE(t1.major, t2.major) AS major FROM tbl01 t1 FULL OUTER JOIN tbl02 t2 ON t1.mat_group = t2.mat_group -- 按物料组排序,方便查看 ORDER BY mat_group;
预期生成的tbl_new结果
执行后你会得到这样的表:
| t1_price | t2_price | mat_group | major |
|---|---|---|---|
| 100 | 150 | a001 | a |
| 200 | 180 | a002 | a |
| 450 | 320 | a003 | a |
| 520 | 220 | b001 | b |
| 250 | 350 | b002 | b |
| 170 | NULL | c001 | c |
| 80 | NULL | c002 | c |
| NULL | 520 | c003 | c |
兼容不支持FULL OUTER JOIN的数据库(比如MySQL)
如果你的数据库不支持全外连接,可以用LEFT JOIN + UNION来模拟:
CREATE TABLE tbl_new AS -- 先取tbl01所有记录,匹配tbl02的价格 SELECT t1.price AS t1_price, t2.price AS t2_price, t1.mat_group, t1.major FROM tbl01 t1 LEFT JOIN tbl02 t2 ON t1.mat_group = t2.mat_group -- 再加上tbl02中独有的记录 UNION SELECT NULL AS t1_price, t2.price AS t2_price, t2.mat_group, t2.major FROM tbl02 t2 LEFT JOIN tbl01 t1 ON t2.mat_group = t1.mat_group WHERE t1.mat_group IS NULL ORDER BY mat_group;
内容的提问来源于stack exchange,提问作者ESpaDA
相关产品推荐
相关产品推荐

