如何在不执行Cross Join的情况下获取两表全部数据并避免笛卡尔积?
解决SQL表合并的笛卡尔积问题
你的SQL语句返回51200条是因为内连接(JOIN)仅用user_id关联时,会让First表中每个user_id=1的条目与Second表中每个user_id=1的条目逐一配对,也就是笛卡尔积,512×100=51200,这是该连接方式的预期结果,但不符合你想要的“合并两表数据”的需求。
如果你想把两个表的记录纵向合并(将First的512条和Second的100条整合为一个结果集),需要用UNION ALL或UNION,注意要保证两边查询的列数、数据类型一致,缺失的字段用NULL填充:
1. 合并完整记录
SELECT id, user_id, user_agent, referrer, browser, device_type, IP, NULL AS name, NULL AS properties FROM first WHERE user_id = 1 UNION ALL SELECT id, user_id, NULL AS user_agent, NULL AS referrer, NULL AS browser, NULL AS device_type, NULL AS IP, name, properties FROM second WHERE user_id = 1;
- 用
UNION ALL会保留所有记录(包括重复项),结果总条数为512+100=612; - 如果需要去重(若两表存在完全重复的记录,此处因结构差异大概率不需要),将
UNION ALL替换为UNION即可。
2. 仅统计合并后的总条数
如果只需要合并后的总记录数,可以简化为:
SELECT COUNT(*) FROM ( SELECT user_id FROM first WHERE user_id = 1 UNION ALL SELECT user_id FROM second WHERE user_id = 1 ) AS combined;
该语句直接返回612,即两表user_id=1的记录数之和。
内容的提问来源于stack exchange,提问作者samlexxy
相关产品推荐
相关产品推荐

