You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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;

关键修改点说明

  1. 用LEFT JOIN替代原有的子查询判断,避免重复查询,同时清晰关联players和teams表
  2. 确保CASE的每个分支都返回单个值:数组或拼接后的字符串,解决了原查询列数不一致的问题
  3. 增加了异常情况处理(可选),避免出现NULL或无法匹配的情况

内容的提问来源于stack exchange,提问作者HJA24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:58:15