【问题标题】:SQL - select where for specific id, all distinct values for other column existSQL - 选择特定 id 的位置,其他列的所有不同值都存在
【发布时间】:2020-11-02 17:05:04
【问题描述】:

我很难解释我想在标题中实现的逻辑。

无论如何,我有一个包含两个表(租金和汽车)的数据库。

car 表包含有关汽车的数据(车牌号等),目前是:

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

租金表包含有关租赁机构租金的数据:

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)

返回 55,1,"{Ford,renault}",因为客户 55 在请求 1 中订购了福特和雷诺的汽车(12345678、13371337)。

问题是,我不允许在课堂上使用array_agg,还有什么其他方法可以实现这个功能?

谢谢

【问题讨论】:

    标签: sql arrays postgresql count relational-division


    【解决方案1】:

    如果要避免数组聚合,可以编写如下查询:

    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)
    

    【讨论】:

    • 好主意,没想到使用可用公司的数量!谢谢,我会在有能力的时候接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多