【发布时间】:2021-01-10 15:42:01
【问题描述】:
我有 3 张桌子:
Table columns
---------------------
items id, name
variations id, item_id
images id, variation_id, type
image 有一个variation 和variation 有一个item
我想找到没有images type 4 或 5 的items(类型是任何整数 0..5 并且不能为 null)
以下查询有效,但它使用 UNION 子查询 带有 NOT IN 约束,我认为这是低效的 - 问题是 因此,编写此查询的更有效方法是什么。
SELECT DISTINCT i.id, i.name
FROM items i
INNER JOIN variations v
ON v.item_id = i.id
INNER JOIN images vi
ON vi.variation_id = v.id
WHERE i.id NOT IN (SELECT i.id FROM items i
INNER JOIN variations v
ON v.item_id = i.id
INNER JOIN images vi
ON vi.variation_id = v.id
WHERE vi.type = 4
UNION
SELECT i.id FROM items i
INNER JOIN variations v
ON v.item_id = i.id
INNER JOIN images vi
ON vi.variation_id = v.id
WHERE vi.type = 5)
解决方案
基于 Gordons 的回答,下面的最终解决方案是:
select i.*
from items i
where not exists (select 1
from variations v join
images im
on v.image_id = im.id
where v.item_id = i.item_id and i.type in (4, 5)
)
and exists (select 1
from variations v join
images im
on v.id = im.variation_id
where v.item_id = i.id)
【问题讨论】:
标签: sql postgresql subquery inner-join union