首页 > 解决方案 > Postgresql 选择不存在具有值 X 或 Y 的关联记录的行

问题描述

我有 3 张桌子:

Table        columns
---------------------
items        id, name
variations   id, item_id
images       id, variation_id, type

image有一个variation并且variation有一个item

我想找到items没有类型4 或 5images(类型是任何整数 0..5 并且不能为null

下面的查询有效,但是它使用了带有NOT IN约束的UNION子查询,我认为这是低效的 - 因此问题是什么是编写此查询的更有效方法。

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)

标签: sqlpostgresqlsubqueryinner-joinunion

解决方案


我想查找没有类型 4 或 5 图像的项目

根据您的描述,这听起来像not exists

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)
                 );

推荐阅读