是否有可能构造SQL来连接列值
多行吗?
举例如下:
表一个
PID
A
B
C
表B
PID SEQ Desc
A 1 Have
A 2 a nice
A 3 day.
B 1 Nice Work.
C 1 Yes
C 2 we can
C 3 do
C 4 this work!
SQL的输出应该是-
PID Desc
A Have a nice day.
B Nice Work.
C Yes we can do this work!
所以基本上输出表的Desc列是来自表B的SEQ值的连接?
SQL有什么帮助吗?
在想要连接的选择中,调用SQL函数。
例如:
select PID, dbo.MyConcat(PID)
from TableA;
然后对于SQL函数:
Function MyConcat(@PID varchar(10))
returns varchar(1000)
as
begin
declare @x varchar(1000);
select @x = isnull(@x +',', @x, @x +',') + Desc
from TableB
where PID = @PID;
return @x;
end
Function Header语法可能是错误的,但原理是正确的。
正如大多数答案所表明的那样,LISTAGG是显而易见的选择。然而,LISTAGG的一个恼人的方面是,如果连接的字符串的总长度超过4000个字符(SQL中VARCHAR2的限制),就会抛出下面的错误,这在12.1以上的Oracle版本中很难管理
ORA-01489:字符串连接的结果太长
12cR2中添加的一个新特性是LISTAGG的ON OVERFLOW子句。
包含这个子句的查询看起来像这样:
SELECT pid, LISTAGG(Desc, ' ' on overflow truncate) WITHIN GROUP (ORDER BY seq) AS desc
FROM B GROUP BY pid;
上面的代码将输出限制在4000个字符,但不会抛出ORA-01489错误。
下面是ON OVERFLOW子句的一些附加选项:
在溢出截断` Contd..':这将显示'Contd..“在
字符串的结尾(默认是…)
ON OVERFLOW TRUNCATE ":这将显示4000个字符
没有任何终止字符串。
ON OVERFLOW TRUNCATE WITH COUNT:这将显示总数
在结束字符之后的字符数。
如:“……(5512)”
ON OVERFLOW错误:如果您期望LISTAGG在
ORA-01489错误(这是默认的)。