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
相关产品推荐
相关产品推荐

