Postgres:根据关系表上的一些子句从表中选择数据

时间:2019-05-23 13:16:51

标签: sql postgresql

假设我们有两个表:

person (
    id int,
    name varchar,
    surname varchar
)

vehicle (
    id int,
    make varchar,
    model varchar,
    has_gps boolean,
    has_ac boolean
    person_id
)

我想选择所有拥有至少一部具有GPS车辆(has_gps = true)和至少一部具有AC车辆(has_ac = true)的人。

因此,基本上人必须至少有2辆车,但至少必须有1辆具有GPS的车辆和至少1辆具有AC的车辆。

我尝试过使用存在,但是我似乎无法弄清楚如何在postgres中做到这一点。

例如:

Person (1, 'Michael', 'Jordan')
Person (2, 'Leo', 'Messi')

Vehicle (1, 'bmw', 'x5', true, false, 1)
Vehicle (2, 'ferrari', 'testarossa', false, true, 1)
Vehicle (3, 'mercedes', 's class', true, true, 2)

在结果中,我应该只获得ID为1的人,因为它至少有一辆载有gps的车辆和至少一辆有ac的车辆。

2 个答案:

答案 0 :(得分:1)

类似的东西:

select person_id from vehicle
group by person_id
having
count(case when has_gps then 1 end ) > 0
and
count(case when has_ac then 1 end ) > 0
and
count(*) > 1

答案 1 :(得分:0)

GROUP BYHAVING结合使用可获得预期结果:

SELECT person_id
FROM vehicle
WHERE has_gps = true OR has_ac = true 
GROUP BY person_id
HAVING COUNT(*) > 1

Demo on db<>fiddle