You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何连接两张表生成指定格式输出?Outer Join未获预期有序结果

问题描述

原始数据表格:

2022年客户邮编表

Cust NameZip 2022
101zip1
101zip2
102zip3

2023年客户邮编表

Cust NameZip 2023
101zip1
103zip2
102zip4

期望输出结果

Cust NameZip 2022Zip 2023
101zip1zip1
101zip2
102zip3
102zip4
103zip2

此前仅通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:24:58