如何构建含字段拼接的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
相关产品推荐
相关产品推荐

