SQL - select 其中对于特定 ID,存在其他列的所有不同值
SQL - select where for specific id, all distinct values for other column exist
我很难解释我想在标题中实现的逻辑。
无论如何,我有一个包含两个 table 的数据库(租金和汽车)。
汽车 table 包含有关汽车的数据(车牌号等),目前是:
lno,myear,comp,doors,shift,boot,seats
12345678,2020,Ford,4,0,500,5
23456789,2019,renault,5,0,1000,7
98765432,2018,Ford,5,1,500,5
13371337,2000,renault,4,1,500,5
租金table包含有关租金在租赁机构中的数据:
cid, rno, lno, fromdate, todate, wid, amount
55,1,12345678,2020-04-02,2020-04-11,99,3750
55,1,98765432,2020-04-02,2020-04-11,98,4200
54,1,23456789,2020-10-15,2020-10-17,97,1200
55,1,13371337,2020-04-02,2020-04-11,99,1337
我想查询从所有可用公司(福特和雷诺)订购的此特定请求汽车的 cid、rno(client_id、请求编号)。
我通过创建一个为每个 cid,rno 租用的公司数组并将其与所有可用公司的数组进行比较来实现它:
with all_companies as (
select array_agg(distinct comp) as all_distinct_companies
from car
),
rents_and_companies as (
select cid, rno, array_agg(distinct comp) as rent_all_companies
from rent,
car
where rent.lno = car.lno
group by cid, rno)
select *
from rents_and_companies
where rent_all_companies = (select all_distinct_companies from all_companies)
returns 55,1,"{Ford,renault}"
因为客户 55 在请求 1 中订购了福特和雷诺的汽车 (12345678, 13371337)。
问题是,我不允许在 class 中使用 array_agg
,还有什么方法可以实现此功能?
谢谢
如果想避免数组聚合,可以这样写查询:
select r.cid, r.rno
from rent r
inner join car c on c.lno = r.lno
group by r.cid, r.rno
having count(distinct c.comp) = (select count(distinct comp) from car)
我很难解释我想在标题中实现的逻辑。
无论如何,我有一个包含两个 table 的数据库(租金和汽车)。
汽车 table 包含有关汽车的数据(车牌号等),目前是:
lno,myear,comp,doors,shift,boot,seats
12345678,2020,Ford,4,0,500,5
23456789,2019,renault,5,0,1000,7
98765432,2018,Ford,5,1,500,5
13371337,2000,renault,4,1,500,5
租金table包含有关租金在租赁机构中的数据:
cid, rno, lno, fromdate, todate, wid, amount
55,1,12345678,2020-04-02,2020-04-11,99,3750
55,1,98765432,2020-04-02,2020-04-11,98,4200
54,1,23456789,2020-10-15,2020-10-17,97,1200
55,1,13371337,2020-04-02,2020-04-11,99,1337
我想查询从所有可用公司(福特和雷诺)订购的此特定请求汽车的 cid、rno(client_id、请求编号)。
我通过创建一个为每个 cid,rno 租用的公司数组并将其与所有可用公司的数组进行比较来实现它:
with all_companies as (
select array_agg(distinct comp) as all_distinct_companies
from car
),
rents_and_companies as (
select cid, rno, array_agg(distinct comp) as rent_all_companies
from rent,
car
where rent.lno = car.lno
group by cid, rno)
select *
from rents_and_companies
where rent_all_companies = (select all_distinct_companies from all_companies)
returns 55,1,"{Ford,renault}"
因为客户 55 在请求 1 中订购了福特和雷诺的汽车 (12345678, 13371337)。
问题是,我不允许在 class 中使用 array_agg
,还有什么方法可以实现此功能?
谢谢
如果想避免数组聚合,可以这样写查询:
select r.cid, r.rno
from rent r
inner join car c on c.lno = r.lno
group by r.cid, r.rno
having count(distinct c.comp) = (select count(distinct comp) from car)