【问题标题】:Flattening columns in a one-to-many relationship in Oracle 10g在 Oracle 10g 中以一对多关系展平列
【发布时间】:2010-10-22 20:55:51
【问题描述】:

我猜这是弄清楚要使用什么 oracle 命令的问题,但是经过几个小时的谷歌搜索,我还没有找到任何可以满足我需要的东西。因此,简而言之,这就是我需要发生的事情:

表 1 表 2 |项目ID | |项目ID |用户名 | |-----------| |---------|----------| |项目1 | |项目1 |用户1 | |项目2 | |项目1 |用户2 | |项目3 | |项目1 |用户3 | |项目4 | |项目2 |用户2 | |项目5 | |项目3 |用户5 |

我需要生成一个 SQL 查询,以便使用上述两个表,我可以生成如下所示的结果:

|项目ID |用户 ID | |----------|---------| |项目1 |用户 1,用户 2,用户 3 | |项目2 |用户2 | |项目3 |用户5 |

我想尝试的第一件事是加入语句,但我相信你们中的许多人都知道,这将为每个项目提供一个包含多行的结果。我还遇到了几个关于枢轴的教程,但这实际上只是为了将您的结果翻转过来,而不是实际聚合一行的字符串值。我对 SQL 的更高级部分还是有点陌生​​,所以很可能我只是在谷歌上搜索错误的东西来弄清楚如何做到这一点。我可能可以用 Java 编写一个解决方案(这是 web 应用程序的一部分),它只会遍历行并拉出每个用户,但我真的很想学习一种让 SQL 为我做这部分的方法。

非常感谢您提供的任何帮助!

【问题讨论】:

    标签: sql oracle string plsql oracle10g


    【解决方案1】:

    这里是使用 collect_func() 的示例代码的解释

    http://www.adp-gmbh.ch/blog/2005/march/28.html

    【讨论】:

      【解决方案2】:

      Read this page about String Concatenation in Oracle.

      假设可用,可以使用 wm_concat:

        SELECT a.prjid,
               wm_concat(b.userid) AS userids
          FROM TABLE_1 a
          JOIN TABLE_2 b ON b.prjid = a.prjid
      GROUP BY a.prjid
      

      【讨论】:

      • 不幸的是,我们没有使用 11g,但是感谢指向该页面的指针,也许我可以从中得到一些有用的东西!
      • 不,正如我在标题中所说,我们使用的是 10g。看起来 UDF 是我唯一能做的事情,只是要弄清楚如何制作一个能满足我需要的 UDF。
      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 2018-09-29
      • 2020-05-24
      • 2010-09-22
      • 2017-06-07
      • 1970-01-01
      相关资源
      最近更新 更多