gpt4 book ai didi

sql - 在 PL/SQL 中完成的问题的解决方案在 SQL 中会是什么样子?

转载 作者:行者123 更新时间:2023-12-04 12:24:57 24 4
gpt4 key购买 nike

我已经使用 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”

正如这里所 promise 的,是创建所有提到的对象的脚本。
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')
/

最佳答案

这样的事情应该让你得到你正在寻找的东西:

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!

关于sql - 在 PL/SQL 中完成的问题的解决方案在 SQL 中会是什么样子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com