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

如何构建含字段拼接的SQL关联查询以获取目标结果?

解决方案:关联Orders与Types表并拼接ident_st字段值

嘿,这个需求其实挺常见的——核心就是先把两张表关联起来,再按id_pr和rodz_st分组,用对应数据库的字符串聚合函数把相同分组下的ident_st值拼接成逗号分隔的字符串。我分不同数据库给你具体示例:

MySQL 实现

MySQL里用GROUP_CONCAT函数来做字符串拼接,默认就是逗号分隔,也可以自定义分隔符:

SELECT
    t.id_pr,
    t.rodz_st,
    GROUP_CONCAT(o.ident_st SEPARATOR ', ') AS combined_ident_st
FROM
    Types t
JOIN
    Orders o ON t.id_pr = o.id_pr
WHERE
    t.rodz_st = 'DZE' -- 按需添加过滤条件,比如指定id_pr=13就加AND t.id_pr = 13
GROUP BY
    t.id_pr,
    t.rodz_st;

如果要去掉重复的ident_st值,可以在函数里加DISTINCT:GROUP_CONCAT(DISTINCT o.ident_st SEPARATOR ', ')。

SQL Server 实现

SQL Server 2017及以上版本支持STRING_AGG函数,用法更简洁:

SELECT
    t.id_pr,
    t.rodz_st,
    STRING_AGG(o.ident_st, ', ') AS combined_ident_st
FROM
    Types t
JOIN
    Orders o ON t.id_pr = o.id_pr
WHERE
    t.rodz_st = 'DZE'
    -- AND t.id_pr = 13
GROUP BY
    t.id_pr,
    t.rodz_st;

PostgreSQL 实现

PostgreSQL同样用STRING_AGG函数,和SQL Server的写法一致:

SELECT
    t.id_pr,
    t.rodz_st,
    STRING_AGG(o.ident_st, ', ') AS combined_ident_st
FROM
    Types t
JOIN
    Orders o ON t.id_pr = o.id_pr
WHERE
    t.rodz_st = 'DZE'
    -- AND t.id_pr = 13
GROUP BY
    t.id_pr,
    t.rodz_st;

如果需要对拼接的结果排序,可以加ORDER BY:STRING_AGG(o.ident_st, ', ') ORDER BY o.ident_st。

Oracle 实现

Oracle用LISTAGG函数,需要指定WITHIN GROUP子句,还能顺便排序:

SELECT
    t.id_pr,
    t.rodz_st,
    LISTAGG(o.ident_st, ', ') WITHIN GROUP (ORDER BY o.ident_st) AS combined_ident_st
FROM
    Types t
JOIN
    Orders o ON t.id_pr = o.id_pr
WHERE
    t.rodz_st = 'DZE'
    -- AND t.id_pr = 13
GROUP BY
    t.id_pr,
    t.rodz_st;

额外注意事项

  • 如果ident_st可能存在NULL值,可以用COALESCE把NULL转换成空字符串,避免影响拼接结果,比如GROUP_CONCAT(COALESCE(o.ident_st, ''), ', ')
  • 如果需要保留Types表中没有对应Orders记录的行,可以把JOIN改成LEFT JOIN,此时拼接结果会是NULL,可以用COALESCE转换成空字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:36:33