相关子查询中的NOT EXIST返回太多行

时间:2016-11-10 16:37:03

标签: sql postgresql

我想选择N个条件与关联表匹配的记录。

我目前试图像这样完成

select v.id, name
from visitors v
left join trackings t on t.visitor_id = v.id
where 
    v.app_id = 'A0I' 
    and (
        (NOT EXISTS (
            SELECT v.id
            FROM trackings not_t 
            WHERE v.id = not_t.visitor_id and field = 'admin'
        ))
        or (t.field = 'app_name' and t.string_value ILIKE 'gitchecker')
        or (t.field = 'users_created' and t.integer_value > 0)
    )
    group by v.id
    having count(*) = 3 -- <number of conditions>

除非我尝试通过NOT EXISTS子查询表达“未知”条件,否则哪个工作正常。此子查询返回太多行,因为它似乎不会在v.id = not_t.visitor_id

上进行过滤

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我不确定你的版本为什么不起作用。可能是HAVING子句应该是2或3,具体取决于匹配。

但是,为什么不这样说出逻辑?

select v.id, name
from visitors v join
     trackings t 
     on t.visitor_id = v.id
where v.app_id = 'A0I' 
group by v.id, name
having sum( (t.field = 'app_name' and t.string_value ILIKE 'gitchecker')::int) > 0) and
       sum( (t.field = 'users_created' and t.integer_value > 0)::int) > 0 and
       sum( (t.field = 'admin')::int) = 0;

请注意,left join是不必要的,因为您的条件需要匹配。

我发现对于这些类型的查询 - set-with-set查询 - group byhaving是表达大多数条件的最通用方式。