如何将两个SQL查询结果输出为同一结果集中的不同列?
解决方案:合并两个世界杯球员查询结果为不同列
没问题,我来帮你把这两个查询的结果合并成一个包含两列的结果集,这里有几种实用的方法,你可以根据需求选择:
方法1:子查询作为列(汇总式展示)
这种方式会把两个分组的球员名单分别打包到两个列里,一行就能看完所有结果,适合快速汇总查看:
SELECT -- 同时参加2015和2016世界杯的球员名单 (SELECT GROUP_CONCAT(DISTINCT w15.player_name SEPARATOR ', ') FROM world_cup_2015 w15 JOIN world_cup_2016 w16 ON w15.player_id = w16.player_id) AS players_in_both_cups, -- 仅参加2015世界杯的球员名单 (SELECT GROUP_CONCAT(DISTINCT w15.player_name SEPARATOR ', ') FROM world_cup_2015 w15 LEFT JOIN world_cup_2016 w16 ON w15.player_id = w16.player_id WHERE w16.player_id IS NULL) AS players_only_2015;
跨数据库适配提示:
如果你的数据库不是MySQL,需要替换字符串聚合函数:
- PostgreSQL 用
STRING_AGG(w15.player_name, ', ') - SQL Server 2017+ 用
STRING_AGG(w15.player_name, ', '),旧版本可以用STUFF((SELECT ', ' + player_name FROM ... FOR XML PATH('')), 1, 2, '')
方法2:逐行拆分展示(无冗余NULL优化版)
如果想要逐行查看每个球员,并且明确他属于哪个分组,可以用UNION ALL来避免大量NULL值:
SELECT player_name AS players_in_both_cups, NULL AS players_only_2015 FROM world_cup_2015 w15 JOIN world_cup_2016 w16 ON w15.player_id = w16.player_id UNION ALL SELECT NULL AS players_in_both_cups, player_name AS players_only_2015 FROM world_cup_2015 w15 LEFT JOIN world_cup_2016 w16 ON w15.player_id = w16.player_id WHERE w16.player_id IS NULL;
这种方式会把每个符合条件的球员放在对应的列里,另一列显示NULL,方便你单独浏览每个分组的球员,同时保持结果在同一个结果集中。
方法3:条件聚合(球员维度详情展示)
如果想同时查看每个球员的参与状态和对应分组列,可以用CASE表达式实现:
SELECT w15.player_name, CASE WHEN w16.player_id IS NOT NULL THEN w15.player_name END AS in_both_cups, CASE WHEN w16.player_id IS NULL THEN w15.player_name END AS only_2015_cup FROM world_cup_2015 w15 LEFT JOIN world_cup_2016 w16 ON w15.player_id = w16.player_id;
这个方法适合查看单个球员的详细参与情况,同时保留两个目标列的信息。
内容的提问来源于stack exchange,提问作者kushoba pavan kumar
相关产品推荐
相关产品推荐

