我有两张桌子
表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
是否有查询可以实现此目的。
答案 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分隔列表。每个数据单元只有单独的行。