Sql 如何在DB2中一行中选择两个行值
我想在一行中选择两个行值并连接Sql 如何在DB2中一行中选择两个行值,sql,db2,concatenation,Sql,Db2,Concatenation,我想在一行中选择两个行值并连接 id value ------------ 1 abc 1 def 2 ghi 3 jkl 3 mno 3 prs 结果应该如下所示: id value ------------ 1 abc, def 2 ghi 3 jkl, mno, prs 我该怎么做?发布的@Dems链接在功能上与您的要求完全相同 但是,如果您没有访问xml函数的权限,这里有一个递归
id value
------------
1 abc
1 def
2 ghi
3 jkl
3 mno
3 prs
结果应该如下所示:
id value
------------
1 abc, def
2 ghi
3 jkl, mno, prs
我该怎么做?发布的@Dems链接在功能上与您的要求完全相同 但是,如果您没有访问xml函数的权限,这里有一个递归CTE版本:
WITH Indexed(id, value, index)
as (SELECT id, value, ROW_NUMBER() OVER(PARTITION BY id ORDER BY value)
FROM ValueTable),
Concatenated(id, index, concatenated)
as (SELECT id, index, value
FROM Indexed
WHERE index = 1
UNION ALL
SELECT a.id, a.index + 1, a.concatenated || ', ' || b.value
FROM Concatenated as a
JOIN Indexed as b
ON b.id = a.id
AND b.index = a.index + 1)
SELECT a.id, a.value
FROM Concatenated as a
EXCEPTION JOIN Indexed as b
ON b.id = a.id
AND b.index > a.index
如果初始表上有一个唯一的索引,则
索引的CTE可以替换为对原始表的引用。这似乎有些轻率,但通常的答案是不。如果出于显示原因而要执行此操作,请在应用程序中执行此处理。如果你想按照数据的原因来做,将数据保持为标准化的1:多关系,并考虑以这种格式处理它(如果你发布你正在处理的用例,我们可以帮助它)。但是将多个值压缩成一个值通常是一种SQL反模式,它会给未来带来更多的痛苦。@Dems你是对的。原因是厨师的特殊要求。我仍然建议尽量避免这样做。需要这样做通常是一个更普遍问题的症状。但我之前评论中的链接可能会让你朝着正确的方向去做。@Dems感谢你的帮助和评论。