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

如何用Oracle左连接生成非规范化分隔列(无需SQL外后处理)

没问题!要实现把左连接后的content字段合并成逗号分隔的非规范化格式,不用外部后处理的话,不同SQL数据库有对应的聚合函数可以直接搞定,我给你分常用数据库列出来:

具体实现方案

MySQL/MariaDB

用GROUP_CONCAT()函数结合左连接+分组就能搞定:

SELECT 
    x.id,
    COALESCE(GROUP_CONCAT(y.content SEPARATOR ','), '') AS content
FROM Table_X x
LEFT JOIN Table_Y y ON x.id = y.id_foreign
GROUP BY x.id;

加COALESCE是为了把没有匹配内容的id(比如2、3)的content显示为空字符串,而不是默认的NULL。

PostgreSQL

用STRING_AGG()函数,还能指定合并后的内容顺序:

SELECT 
    x.id,
    COALESCE(STRING_AGG(y.content, ',' ORDER BY y.content), '') AS content
FROM Table_X x
LEFT JOIN Table_Y y ON x.id = y.id_foreign
GROUP BY x.id;

SQL Server

如果是2017及以上版本,直接用STRING_AGG():

SELECT 
    x.id,
    COALESCE(STRING_AGG(y.content, ',') WITHIN GROUP (ORDER BY y.content), '') AS content
FROM Table_X x
LEFT JOIN Table_Y y ON x.id = y.id_foreign
GROUP BY x.id;

要是用的是旧版本SQL Server,就用FOR XML PATH的写法来模拟字符串聚合:

SELECT 
    x.id,
    ISNULL(
        STUFF(
            (SELECT ',' + y.content 
             FROM Table_Y y 
             WHERE y.id_foreign = x.id 
             FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
            1, 1, ''
        ), ''
    ) AS content
FROM Table_X x
GROUP BY x.id;

Oracle

11g及以上版本用LISTAGG()函数:

SELECT 
    x.id,
    NVL(LISTAGG(y.content, ',') WITHIN GROUP (ORDER BY y.content), '') AS content
FROM Table_X x
LEFT JOIN Table_Y y ON x.id = y.id_foreign
GROUP BY x.id;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:16:16