sql - 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)
解决方案
我想查找没有类型 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)
);
推荐阅读
- gtk - 如何释放 Gtk::Button?
- android - 在不同的活动中测试两个文本
- r - ld:警告:基于文本的存根文件不同步。回退到库文件进行链接
- polymer-3.x - 我们如何安装 mwc-menu
- php - 这是否符合能够防止 SQL 注入黑客攻击的准备好的语句?
- python - 包含列表的字典
- scala - Scala不适用于泛型参数
- javascript - 淡化没有立即连接到悬停在 d3 图中的节点的链接和节点
- c++ - 如何在派生类中不显式调用 Base::func() 的情况下从基类执行虚函数?
- java - 在 Heroku 上设置 PostgreSQL 数据库(需要 entityManagerFactory)