是否有可能构造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模型子句:
SQL> select pid
2 , ltrim(sentence) sentence
3 from ( select pid
4 , seq
5 , sentence
6 from b
7 model
8 partition by (pid)
9 dimension by (seq)
10 measures (descr,cast(null as varchar2(100)) as sentence)
11 ( sentence[any] order by seq desc
12 = descr[cv()] || ' ' || sentence[cv()+1]
13 )
14 )
15 where seq = 1
16 /
P SENTENCE
- ---------------------------------------------------------------------------
A Have a nice day
B Nice Work.
C Yes we can do this work!
3 rows selected.
我在这里写过。如果链接到otn线程,您将找到更多内容,包括性能比较。
SQL模型子句:
SQL> select pid
2 , ltrim(sentence) sentence
3 from ( select pid
4 , seq
5 , sentence
6 from b
7 model
8 partition by (pid)
9 dimension by (seq)
10 measures (descr,cast(null as varchar2(100)) as sentence)
11 ( sentence[any] order by seq desc
12 = descr[cv()] || ' ' || sentence[cv()+1]
13 )
14 )
15 where seq = 1
16 /
P SENTENCE
- ---------------------------------------------------------------------------
A Have a nice day
B Nice Work.
C Yes we can do this work!
3 rows selected.
我在这里写过。如果链接到otn线程,您将找到更多内容,包括性能比较。
正如大多数答案所表明的那样,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错误(这是默认的)。