如何连接两张表生成指定格式输出?Outer Join未获预期有序结果
问题描述
原始数据表格:
2022年客户邮编表
| Cust Name | Zip 2022 |
|---|---|
| 101 | zip1 |
| 101 | zip2 |
| 102 | zip3 |
2023年客户邮编表
| Cust Name | Zip 2023 |
|---|---|
| 101 | zip1 |
| 103 | zip2 |
| 102 | zip4 |
期望输出结果
| Cust Name | Zip 2022 | Zip 2023 |
|---|---|---|
| 101 | zip1 | zip1 |
| 101 | zip2 | |
| 102 | zip3 | |
| 102 | zip4 | |
| 103 | zip2 |
此前仅通过Cust Name做外连接未得到预期结果,且排序不符合要求。
解决方案
核心思路
需要同时基于客户名称和邮编值做全外连接,确保同客户同邮编的记录合并为一行,不同邮编的记录各自保留;最后通过排序规则让结果匹配预期布局。
支持全外连接的数据库(SQL Server、PostgreSQL等)
SELECT COALESCE(z22."Cust Name", z23."Cust Name") AS "Cust Name", z22."Zip 2022", z23."Zip 2023" FROM zip_2022 z22 FULL OUTER JOIN zip_2023 z23 ON z22."Cust Name" = z23."Cust Name" AND z22."Zip 2022" = z23."Zip 2023" ORDER BY "Cust Name", CASE WHEN z22."Zip 2022" IS NOT NULL THEN 0 ELSE 1 END, -- 优先显示有2022邮编的行 z22."Zip 2022", z23."Zip 2023";
MySQL(不支持FULL OUTER JOIN,用UNION ALL模拟)
-- 左连接获取2022表所有记录及匹配的2023记录 SELECT COALESCE(z22."Cust Name", z23."Cust Name") AS "Cust Name", z22."Zip 2022", z23."Zip 2023" FROM zip_2022 z22 LEFT JOIN zip_2023 z23 ON z22."Cust Name" = z23."Cust Name" AND z22."Zip 2022" = z23."Zip 2023" UNION ALL -- 补充2023表中未在2022表匹配到的记录 SELECT z23."Cust Name" AS "Cust Name", NULL AS "Zip 2022", z23."Zip 2023" FROM zip_2023 z23 LEFT JOIN zip_2022 z22 ON z22."Cust Name" = z23."Cust Name" AND z22."Zip 2022" = z23."Zip 2023" WHERE z22."Cust Name" IS NULL ORDER BY "Cust Name", CASE WHEN "Zip 2022" IS NOT NULL THEN 0 ELSE 1 END, "Zip 2022", "Zip 2023";
为什么之前的外连接失败?
仅通过Cust Name关联会导致同客户的所有2022、2023邮编行产生笛卡尔积,出现多余重复行;同时缺少邮编值的匹配,无法将同客户同邮编的记录合并为一行。加上邮编匹配的关联条件后,才能精准控制记录的合并与保留。
内容的提问来源于stack exchange,提问作者Data_miner
相关产品推荐
相关产品推荐

