我已经使用PL / SQL和SQL编写了一个解决问题的解决方案,我不禁想到它可以在SQL中100%完成,但我正在努力开始。
这是两个表的结构(如果有帮助,创建它们的脚本就在问题的最后)
表t1(主键是显示的两列)
ID TYPE
1 A
1 B
1 C
2 A
2 B
3 B
Type列是表T2的外键,包含以下数据:
表t2(主键是Type)
Type Desc
A xx
B xx
C xx
因此,鉴于T1中的数据,我需要的结果是:
对于ID 1,因为它具有外键表中的所有类型,我将返回文字“All”
对于ID 2,因为它有两种类型我想要返回“A& B”(注意分隔符)
最后对于ID 3,因为它有一种类型,我只想返回“B”
这里承诺的是创建所有提到的对象的脚本。
create table t2(type varchar2(1),
description varchar2(100)
)
/
insert into t2
values ('A', 'xx')
/
insert into t2
values ('B', 'xx')
/
insert into t2
values ('C', 'xx')
/
alter table t2 add constraint t2_pk primary key (type)
/
create table t1 (id number(10),
type varchar2(1)
)
/
alter table t1 add constraint t1_pk primary key(id, type)
/
alter table t1 add constraint t1_fk foreign key (type)
references t2(type)
/
insert into t1
values (1, 'A')
/
insert into t1
values (1, 'B')
/
insert into t1
values (1, 'C')
/
insert into t1
values (2, 'A')
/
insert into t1
values (2, 'B')
/
insert into t1
values (3, 'B')
/
答案 0 :(得分:5)
这样的事情可以让你得到你想要的东西:
select
id,
case
when cnt = (select count(distinct type) from t2)
then 'All'
else ltrim(sys_connect_by_path(type,' & '),' &')
end types
from (
select
t1.id,
t2.type,
count(*) over (partition by t1.id) cnt,
row_number() over (partition by t1.id order by t2.type) rn
from
t1
inner join t2
on t2.type = t1.type
)
where
rn = cnt
start with rn = 1
connect by prior id = id and prior rn = rn-1;
如果可以发布你的对象/数据创建脚本,我会给你+10的问题!