【问题标题】:ORACLE Listagg with an Inner Join带有内部联接的 ORACLE Listagg
【发布时间】:2014-03-12 15:04:17
【问题描述】:

我需要从两个值匹配的两个表中提取数据。连接表产生 5 行,并且总是产生 5 行。

有没有一种方法可以获取具有不同值的一列并在一行中返回多列?

举个例子: 表 A: orig_zip、dest_zip、pri_mode

表 B: orig_zip、dest_zip、serv_comm

在执行如下内部连接时,表 B 将始终为表 A 中的每 1 个结果返回 5 个结果:

SELECT a.orig_zip, a.dest_zip, b.serv_comm, a.pri_mode
FROM A a
INNER JOIN B b
ON a.orig_zip = b.orig_zip and a.dest_zip = b.dest_zip
ORDER BY a.orig_zip, a.dest_zip, b.mail_class;

如何获取 5 个结果,并将它们转换为 oracle 中的一行。结果中唯一不同的字段是 serv_comm 字段。

最后一行应具有以下设置:

[ORIG_ZIP][DEST_ZIP][SERV_COMM1][SERV_COMM2][SERV_COMM3][SERV_COMM4][SERV_COMM5][PRI_MODE]

【问题讨论】:

    标签: sql oracle join inner-join


    【解决方案1】:

    我做了一些研究,这是 SQL Fiddle 上的答案!

    http://sqlfiddle.com/#!4/783b8/1/0

    【讨论】:

      【解决方案2】:

      从 11g 开始,您也可以使用 PIVOT 子句来做到这一点:

      FROM  trans_mode a
      INNER JOIN servcomm b
      ON a.orig_zip = b.orig_zip and a.dest_zip = b.dest_zip
      pivot
      (
        max(serv_comm)
        for (mail_class)
        in ('PRI' AS pri_serv, 'FCM' AS fcm_serv, 'PER' AS per_serv, 'PKG' AS pkg_serv, 'STD' AS std_serv)
        );
      

      Here is a sqlfiddle demo (based on yours)

      【讨论】:

      • 谢谢,我试试看!
      猜你喜欢
      • 2011-12-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2017-06-20
      • 1970-01-01
      • 2021-05-29
      • 2011-03-28
      相关资源
      最近更新 更多