是否有可能构造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有什么帮助吗?


当前回答

正如大多数答案所表明的那样,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错误(这是默认的)。

其他回答

在运行select查询之前,运行以下命令:

将服务器设置为6000大小

SELECT XMLAGG(XMLELEMENT(E,SUPLR_SUPLR_ID||',')).EXTRACT('//text()') "SUPPLIER" 
FROM SUPPLIERS;

有几种方法取决于你有什么版本-请参阅oracle文档关于字符串聚合技术。一个非常常见的方法是使用LISTAGG:

SELECT pid, LISTAGG(Desc, ' ') WITHIN GROUP (ORDER BY seq) AS description
FROM B GROUP BY pid;

然后加入A,挑出你想要的皮皮。

注意:开箱即用,LISTAGG只对VARCHAR2列正确工作。

正如大多数答案所表明的那样,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错误(这是默认的)。

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线程,您将找到更多内容,包括性能比较。

还有一个XMLAGG函数,它适用于11.2之前的版本。因为WM_CONCAT没有文档,Oracle也不支持,所以建议不要在生产系统中使用它。

使用XMLAGG你可以做以下事情:

SELECT XMLAGG(XMLELEMENT(E,ename||',')).EXTRACT('//text()') "Result" 
FROM employee_names

它的作用是

将employee_names表中的ename列的值(用逗号连接)放在xml元素中(带有标记E) 提取其中的文本 聚合XML(连接它) 将结果列命名为Result