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

SQL多表连接问题:内连接行数异常,需实现列并排关联

问题解决:跨表合并并保留所有产品日期记录

为什么内连接返回600多行?

这是因为t1或t2中存在重复的(product_number, date)组合。内连接会对两边匹配的记录做笛卡尔积,比如t1中某产品某天有2条记录,t2中同产品同天有3条,连接后就会生成6条记录,累加后总条数远超原表行数。

可以用以下SQL检查重复数据:

-- 检查t1中的重复记录
SELECT product_number, date, COUNT(*) AS cnt
FROM t1
GROUP BY product_number, date
HAVING COUNT(*) > 1;

-- 检查t2中的重复记录
SELECT product_number, date, COUNT(*) AS cnt
FROM t2
GROUP BY product_number, date
HAVING COUNT(*) > 1;

实现你需要的输出格式

你需要保留所有存在于t1或t2中的product_number+date组合,未匹配的字段填充NULL,这需要用全外连接(FULL OUTER JOIN):

SELECT
    COALESCE(t1.product_number, t2.product_number) AS product_number,
    COALESCE(t1.date, t2.date) AS date,
    t1.sales_before,
    t2.sales_after
FROM t1
FULL OUTER JOIN t2
    ON t1.product_number = t2.product_number
    AND t1.date = t2.date
ORDER BY date;

适配不支持FULL OUTER JOIN的数据库(如MySQL)

如果你的数据库不支持FULL OUTER JOIN,可以用UNION ALL结合左连接和右连接模拟:

-- MySQL 模拟全外连接
SELECT
    t1.product_number,
    t1.date,
    t1.sales_before,
    t2.sales_after
FROM t1
LEFT JOIN t2
    ON t1.product_number = t2.product_number
    AND t1.date = t2.date

UNION ALL

SELECT
    t2.product_number,
    t2.date,
    t1.sales_before,
    t2.sales_after
FROM t2
LEFT JOIN t1
    ON t1.product_number = t2.product_number
    AND t1.date = t2.date
WHERE t1.product_number IS NULL
ORDER BY date;

说明

  • COALESCE函数用于取两个字段中的非NULL值,确保product_number和date字段始终有值(当其中一张表无对应记录时,取另一张表的值)
  • 最终结果会包含t1和t2中所有的产品日期组合,未匹配的销量字段自动填充NULL

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:45:30