PostgreSQL查找不带';不存在于另外两个表中
我想将PostgreSQL查找不带';不存在于另外两个表中,postgresql,Postgresql,我想将io表中的io\u dl字段从1更改为0,前提是这三个条件都成立 iotable pkey->io\u id io的pkey不在整个表m中,fkey名为m\u id io的pkey不包含在表p列p\u id中,该列是以csv分隔的id字符串,例如“19232309210” io表中的io\u dl字段的当前值设置为1 我想第3步是不需要的,因为将0设置为0并不会真的搞乱任何事情,额外的检查可能会减慢查询速度 这就是我尝试过的,我得到了一个相同的io\u ids列表,我认为我使用join或u
io
表中的io\u dl
字段从1更改为0,前提是这三个条件都成立
io
table pkey->io\u id
io
的pkey不在整个表m
中,fkey名为m\u id
io
的pkey不包含在表p
列p\u id
中,该列是以csv分隔的id字符串,例如“19232309210”io
表中的io\u dl
字段的当前值设置为1io\u id
s列表,我认为我使用join或union是错误的
update io set io_dl = 0
where io_id in (
select i.io_id from io i
inner join (
select p_id as "io_id" from p
union
select regexp_split_to_table(m.m_id, ',')::integer
as id from m
) q
on i.io_id != q.io_id
where i.io_dl = 1
);
几分钟后,我用一个更简单的问题提出了自己的解决方案
update io set io_dl = 0
where io_id in (
select i.io_id from io i
where i.io_id not in (
select p_id as "io_id" from p
union
select regexp_split_to_table(m.m_id, ',')::integer as "io_id" from m
) and i.io_dl = 1
);
使用
except
获取不同的id
:
update io
set io_dl = 0
where io_id in (
select io_id from io
except (
select p_id from p
union
select regexp_split_to_table(m_id, ',')::integer from m
)
) and io_dl = 1
returning *;
通过添加returning*
可以控制更新了多少行