在Oracle 10g中以一对多关系展平列

时间:2010-10-22 20:55:52

标签: sql oracle string plsql oracle10g

我猜这是一个弄清楚要使用什么oracle命令的问题,但经过几个小时的谷歌搜索后,我找不到任何可以做我需要的东西。所以这就是我需要简单发生的事情:

  Table 1                   Table 2
|  PrjID   |       |  PrjID   |  UserID  |  
|----------|       |----------|----------|  
| Project1 |       | Project1 |  User1   |  
| Project2 |       | Project1 |  User2   |  
| Project3 |       | Project1 |  User3   |  
| Project4 |       | Project2 |  User2   |  
| Project5 |       | Project3 |  User5   |  

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

|  PrjID   |      UserIDs      |  
|----------|-------------------|  
| Project1 | User1,User2,User3 |  
| Project2 | User2             |  
| Project3 | User5             |  

我想要尝试的第一件事是连接语句,但是我相信很多人都知道,这会给每个项目有多行的结果。我还遇到了几个关于枢轴的教程,但这只是为了让你的结果转向它而不是实际聚合一行的字符串值。我对SQL的更高级部分还有点新意,所以我很可能只是在谷歌搜索错误的东西来弄清楚如何做到这一点。我可能会破解Java中的一个解决方案(这是一个webapp的一部分),它只是遍历行并拉出每个用户,但我真的想学习一种让SQL为我做这一部分的方法。

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

2 个答案:

答案 0 :(得分:2)

以下是使用collect_func()

的示例代码的说明

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

答案 1 :(得分:0)

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