计算所有具有特定值的0关系的简单方法

时间:2014-11-10 15:30:18

标签: sql postgresql

我在编写性能良好的查询时遇到了一些麻烦。现在我有两张桌子:

汽车:

id   brand   model_name
1    'Audi'  'A4'
2    'Audi'  'A4'
3    'Audi'  'A4'
4    'Audi'  'A6'
5    'Audi'  'A7'

买家:

id   cars_id  name     activly_looking
1    2        'Brad'   'no'
2    2        'Kim'    'maybe'
3    4        'Sofia'  'yes'
4    4        'Tim'    'no'
5    5        'Tina'   'yes'

现在我需要选择以下车辆的数量:有买家但没有任何买家activly_looking = 'yes'

此示例中的查询应返回1的计数,因为只有标识为2的汽车才符合条件。

顺便说一句。这将作为调试问题的一次性查询完成,但是在一个非常庞大的表(数百万行)上。

3 个答案:

答案 0 :(得分:1)

您可以使用existsnot exists检查条件,然后只进行汇总查询:

select count(*)
from cars c
where exists (select 1 from buyers b where b.cars_id = c.id) and
      not exists (select 1 from buyers b where b.cars_id = c.id and b.acively_looking = 'yes')

答案 1 :(得分:1)

使用条件聚合的另一种方式来过滤所有拥有actively_looking = yes买家的汽车。

内部联接确保汽车至少有1名买家,并且有条款确保没有买家正在积极寻找。

select count(*) from (
    select c.id from cars c
    join buyers b on b.cars_id = c.id
    group by c.id
    having count(case when b.activly_looking = 'yes' then 1 end) = 0
) t1

答案 2 :(得分:-1)

试试这个

 select count(b.cars_id) from
    from cars c
    left join buyers b on b.cars_id = c.id
    where b.activly_looking = 'yes'
    group by c.id