当前位置: 首页 > 面试题库 >

如何在Oracle10g中按顺序连接多行顺序

柯升
2023-03-14
问题内容

如果我有这样的数据:

GROUP  |  SEQUENCE  |  COMMAND
------------------------------
ONE    |     3      |  <message2>MESSAGE</message2>
ONE    |     1      |  <?xml version="1.0" encoding="UTF-8"?>
ONE    |     2      |  <message1>MESSAGE</message1>
TWO    |     2      |  <message2>MESSAGE</message2>
TWO    |     1      |  <?xml version="1.0" encoding="UTF-8"?>
........
TWO    |    10      |  <message9>MESSAGE</message9>

我如何将命令连接成这样:

GROUP  |  COMMAND
-----------------
ONE    |  <?xml version="1.0" encoding="UTF-8"?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO    |  <?xml version="1.0" encoding="UTF-8"?>,<message1>MESSAGE</message1>, .. ,<message9>MESSAGE</message9>

我在下面使用了此查询,但命令列的顺序不依其顺序号而定:

SELECT GROUP, WM_CONCAT(COMMAND) AS COMMAND
     FROM (SELECT GROUP, SEQUENCE, COMMAND FROM TBL ORDER BY SEQUENCE)
     GROUP BY GROUP

//AND THIS

SELECT GROUP, WM_CONCAT(DISTINCT COMMAND) AS COMMAND
 FROM (SELECT GROUP, SEQUENCE, COMMAND FROM TBL ORDER BY SEQUENCE)
 GROUP BY GROUP

任何意见和建议将不胜感激。^ _ ^


问题答案:

永远不要使用WM_CONCAT。阅读为什么不在Oracle中使用WM_CONCAT函数?

请参阅本主题https://stackoverflow.com/a/28758117/3989608。

它没有记录,并且依赖的任何应用程序WM_CONCAT一旦升级到后都将无法工作,12c因为它已从最新的12c版本中删除。

根据 数据库版本* ,有很多方法可以进行 字符串聚合 。请参阅以下几个示例: *

11gR2

用途LIASTAGG

SQL> SELECT grp,
  2    listagg(command, ',') WITHIN GROUP(
  3  ORDER BY seq) command
  4  FROM t
  5  GROUP BY grp;

GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>

SQL>

9i及以上

使用ROW_NUMBER()SYS_CONNECT_BY_PATH

SQL> SELECT grp,
  2         LTRIM(MAX(SYS_CONNECT_BY_PATH(command,','))
  3         KEEP (DENSE_RANK LAST ORDER BY seq),',') command
  4  FROM   (SELECT grp,
  5                 command,
  6                 seq,
  7                 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) AS curr,
  8                 ROW_NUMBER() OVER (PARTITION BY grp ORDER BY seq) -1 AS prev
  9          FROM   t)
 10  GROUP BY grp
 11  CONNECT BY prev = PRIOR curr AND grp = PRIOR grp
 12  START WITH curr = 1;

GRP COMMAND
--- --------------------------------------------------------------------------------------------
ONE <?xml version=1.0 encoding=UTF-8?>,<message1>MESSAGE</message1>,<message2>MESSAGE</message2>
TWO <?xml version=1.0 encoding=UTF-8?>,<message2>MESSAGE</message2>,<message9>MESSAGE</message9>

SQL>


 类似资料:
  • 问题内容: 我有一个包含5个整数ID的表,并想添加一列以接受这些ID,对其进行排序并以类似于以下内容的方式将它们连接起来。 是否有使订购更快更轻松的功能?上帝禁止我必须手动编写订单。 问题答案: 您也可以使用(在线演示)

  • 这就是我试图解决但不确定如何解决的问题:我有一个对象数组(假设大小为100),每个对象都有一些id。 有10个线程将从该数组中读取数据并将其插入数据库。 如何确保数据以递增序列的方式根据员工ID的序列插入数据库。例如: 如果数组中的对象具有员工ID 6、8和4,那么这些对象应该按照员工ID 4、6和8在数据库中的顺序插入数据库。如何为此编写多线程代码? 更新:请忽略数据库部分,如果它令人困惑,我的

  • 在我的示例项目中,我尝试在应用程序启动时做一些初始化工作。 Java 16 Vertx 4.1.0 检查完整的项目代码。 但它并没有像预期的那样工作。 没有像Reactor那样的方法 我找不到一种有效的方法来按顺序执行它们。 更新时间: 我按照建议更改了代码。 并在控制台中获取以下日志。 如何在输入打印结果之前确保插入块中的所有未来都已完成。

  • 我有一个如下的模型: 它填充了一些数据: 我需要合并/加入一个集合(不是queryset): 所以基本上,当我用这个元组列表搜索这个模型时,第0行和第2行应该返回。 目前,我的解决方法是将 读取到数据帧中,并与元组列表进行合并,并将 ID 传递给 。我还尝试迭代列表并在每个元组上调用 但它非常慢。这个清单相当大。 当我尝试按照当前答案的建议链接Q时,它抛出了一个OperationalError(太

  • 问题内容: 我有如下代码: 效果很好,但似乎是以相反的字母顺序列出文件。有没有一种快速的方法可以告诉您按字母顺序列出文件? 问题答案: 带有或不带有过滤器的方法不能保证任何顺序。 但是,它确实返回一个数组,您可以使用对其进行排序。 这是可行的,因为是一个可比较的类,默认情况下按字典顺序对路径名进行排序。如果要对它们进行不同的排序,则可以定义自己的比较器。 如果您更喜欢使用流: 下面是一种更现代的方

  • 问题内容: 我有下表称为问题: 我只想选择每个询问者一次,如果有多个同名提问者,请选择ID最高的一个。因此,预期结果: 我使用以下查询: 我得到以下结果: 因此,它将选择遇到的第一个“鲍勃”,而不是最后一个。 谢谢 问题答案: 如果要为每一个添加最后一个,则应使用聚合函数: 之所以得到不寻常的结果,是因为MySQL使用了一个扩展名,该扩展名允许未选择列表中的项进行汇总,并且不包含在GROUP BY