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

SQL如何对按年份分表、ID重复的SHIP表做LEFT JOIN匹配订单数据

分表关联SQL实现方案

核心解决逻辑:因为年份拆分的SHIP表仅同表内ID唯一,跨表存在重复ID,所以关联时需要同时匹配SHIP_ID和订单对应的年份,以下是两种可直接使用的实现方式:

方案1:合并分表后关联(推荐)

将所有年份的SHIP表通过UNION ALL整合,新增年份标识字段后再和订单表关联,后续新增年份仅需要补充UNION ALL分支即可,扩展性更强。

SELECT 
    CO.*,
    S.SHIP_DATE
FROM COMPANY_ORDERS AS CO
LEFT JOIN (
    -- 合并各年份SHIP表,新增ship_year字段标识归属年份
    SELECT ID, SHIP_DATE, 2020 AS ship_year FROM COMPANY_2020_SHIPS
    UNION ALL
    SELECT ID, SHIP_DATE, 2021 AS ship_year FROM COMPANY_2021_SHIPS
) AS S 
ON S.ID = CO.SHIP_ID 
-- 同时匹配ID和年份,避免同ID跨表匹配错误
AND YEAR(CO.ORDER_DATE) = S.ship_year;

方案2:分别关联各年分表

直接LEFT JOIN所有年份的SHIP表,通过年份条件过滤匹配对应表的记录:

SELECT 
    CO.*,
    -- 按订单年份取对应SHIP表的日期
    CASE YEAR(CO.ORDER_DATE)
        WHEN 2020 THEN S20.SHIP_DATE
        WHEN 2021 THEN S21.SHIP_DATE
        ELSE NULL
    END AS SHIP_DATE
FROM COMPANY_ORDERS AS CO
LEFT JOIN COMPANY_2020_SHIPS AS S20 
    ON S20.ID = CO.SHIP_ID AND YEAR(CO.ORDER_DATE) = 2020
LEFT JOIN COMPANY_2021_SHIPS AS S21 
    ON S21.ID = CO.SHIP_ID AND YEAR(CO.ORDER_DATE) = 2021;

注:以上示例使用MySQL的YEAR()函数提取日期年份,如果你使用其他数据库,可替换为对应语法,比如PostgreSQL/Oracle使用EXTRACT(YEAR FROM CO.ORDER_DATE)即可。

内容的提问来源于stack exchange,提问作者DCYılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:36:03