SQL查询合并:将两个6行查询转为两列输出,避免笛卡尔积
SQL合并查询避免笛卡尔积的解决方案
问题描述
我有两个SQL查询,各自返回6行数据,仅首行内容不同。需要将它们合并为一个两列的输出结果,但尝试多种方案后,均因笛卡尔积生成了大量重复组合的行。
当前输出
UID username % All Incomplete Tasks arthur All Incomplete Tasks jane All Incomplete Tasks john All Incomplete Tasks mary All Incomplete Tasks susan All Incomplete Tasks % arthur arthur arthur jane arthur john arthur mary arthur susan arthur % jane arthur jane jane jane john jane mary jane susan jane % john arthur john jane john john john mary john susan john % mary arthur mary jane mary john mary mary mary susan mary % susan arthur susan jane susan john susan mary susan susan susan
期望输出
UID username % All Incomplete Tasks arthur arthur jane jane john john mary mary susan susan
当前使用的查询语句
SELECT x.UID, y.username FROM (SELECT TOP (100) PERCENT username as UID FROM dbo.goldusers_users UNION SELECT '%' as UID) as x , (SELECT TOP (100) PERCENT username FROM dbo.goldusers_users UNION SELECT 'All Incomplete Tasks' as username) as y
可行解决方案
问题出在你用了交叉连接(逗号分隔两个表/子查询),这会自动生成笛卡尔积。正确的做法是将特殊行单独匹配,再与用户表的自匹配行合并,用UNION ALL实现:
-- 生成特殊匹配行 SELECT '%' AS UID, 'All Incomplete Tasks' AS username UNION ALL -- 生成用户表的自匹配行 SELECT username AS UID, username AS username FROM dbo.goldusers_users
说明
- 第一部分单独生成
%和All Incomplete Tasks的匹配行,确保唯一的特殊组合。 - 第二部分从用户表中取出每行的
username,同时作为UID和username列的值,实现一一对应。 UNION ALL会直接合并两个结果集,不会产生重复或额外行,正好得到你需要的6行数据。- 原查询中的
TOP (100) PERCENT无实际作用(无ORDER BY时不生效),因此可以完全移除。
内容的提问来源于stack exchange,提问作者Michael H
相关产品推荐
相关产品推荐

