ORACLE用逗号分隔的id连接两个表

时间:2016-08-25 20:53:45

标签: sql oracle

我有两张桌子

表1

ID     NAME
1      Person1
2      Person2
3      Person3

表2

ID     GROUP_ID
1      1
2      2,3

上述所有列中的ID引用相同的ID(示例 - 部门)

我的预期输出(通过加入两个表格)

GROUP_ID     NAME
1            Person1
2,3          Person2,Person3

是否有查询可以实现此目的。

2 个答案:

答案 0 :(得分:1)

可以做到。你不应该这样做,但也许你没有能力改变这个世界。 (如果你有发言权,你应该规范化你的表格设计 - 在你的情况下,输入和输出都会失败第一个普通形式。)

更多地回答我自己的良好做法......此解决方案保证名称将以与ID相同的顺序列出。它不是最有效的,并且它不会处理列表中没有在第一个表中找到的id(它只是丢弃它们而不是留下某种标记)。

with
     table_1 ( id, name ) as (
       select 1, 'Person1' from dual union all
       select 2, 'Person2' from dual union all
       select 3, 'Person3' from dual
     ),
     table_2 ( id, group_id ) as (
       select 1, '1' from dual union all
       select 2, '2,3' from dual
     ),
     prep ( id, lvl, token ) as (
       select id, level, regexp_substr(group_id, '[^,]', 1, level)
       from   table_2
       connect by level <= regexp_count(group_id, ',') + 1
              and prior id = id
              and prior sys_guid() is not null
     )
select p.id, listagg(t1.name, ',') within group (order by p.lvl) as group_names
from   table_1 t1 inner join prep p on t1.id = p.token
group by p.id;

  ID GROUP_NAMES
---- --------------------
   1 Person1
   2 Person2,Person3

答案 1 :(得分:0)

select t2.group_id, listagg(t1.name,',') WITHIN GROUP (ORDER BY 1)
  from table2 t2, table1 t1
 where ','||t2.group_id||',' like '%,'||t1.id||',%'
 group by t2.id, t2.group_id

规范你的数据模型,这种变态!数据库中不应存在Сomma分隔列表。每个数据单元只有单独的行。