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

