如何用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
相关产品推荐
相关产品推荐

