如何修改SQL查询以获取赛事对应的主队/选手ID集合?
问题解决:修正SQL查询实现
home_ids集合输出 原查询报错「row value misused」的核心原因是:CASE语句的两个分支返回的结果结构不一致——当home_id是队伍ID时,子查询返回两列数据(pid_1和pid_2),而当它是选手ID时仅返回单个值,SQL无法将不同列数的结果统一为一列输出。
修改思路
要让home_ids列返回统一格式的ID集合,需确保CASE的每个分支都返回单个值:
- 如果是选手ID:返回包含该单个ID的集合(数组或拼接字符串)
- 如果是队伍ID:返回包含两名选手ID的集合(数组或拼接字符串)
同时改用LEFT JOIN关联表,替代原有的子查询判断,提升查询效率和可读性。
方案1:支持数组类型的数据库(如PostgreSQL)
直接用数组类型存储ID集合:
SELECT m.match_id, CASE -- home_id是选手ID,构造单元素数组 WHEN p.pid IS NOT NULL THEN ARRAY[m.home_id] -- home_id是队伍ID,构造双元素数组 WHEN t.tid IS NOT NULL THEN ARRAY[t.pid_1, t.pid_2] -- 处理既不是选手也不是队伍的异常情况(可选) ELSE ARRAY[]::INT[] END AS home_ids FROM matches m LEFT JOIN players p ON m.home_id = p.pid LEFT JOIN teams t ON m.home_id = t.tid;
方案2:不支持数组的数据库(如MySQL)
用字符串拼接的方式返回ID集合(用逗号分隔):
SELECT m.match_id, CASE WHEN p.pid IS NOT NULL THEN CAST(m.home_id AS CHAR) WHEN t.tid IS NOT NULL THEN CONCAT_WS(',', t.pid_1, t.pid_2) ELSE '' END AS home_ids FROM matches m LEFT JOIN players p ON m.home_id = p.pid LEFT JOIN teams t ON m.home_id = t.tid;
关键修改点说明
- 用
LEFT JOIN替代原有的子查询判断,避免重复查询,同时清晰关联players和teams表 - 确保
CASE的每个分支都返回单个值:数组或拼接后的字符串,解决了原查询列数不一致的问题 - 增加了异常情况处理(可选),避免出现
NULL或无法匹配的情况
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

