我想选择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
有什么想法吗?
答案 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 by
和having
是表达大多数条件的最通用方式。