我想在io_dl
表中将io
字段从1更改为0,仅当所有三个条件都成立时
io
table pkey - > io_id
io
的pkey不在整个表m
中,其中fkey名为m_id
io
的pkey未包含在表p
,列p_id
中,这是csv分隔的ids ex字符串。 " 1923,2309,210" io_dl
表格中io
字段的当前值设置为1 步骤3我认为不需要因为设置0到0并没有真正弄乱任何东西,额外的检查可能会减慢查询速度?
这就是我所尝试过的,并且我正在列出列出的io_id
列表的大量列表,我认为我错误地使用了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
);
答案 0 :(得分:2)
使用except
获取不同的ids
:
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 *
,您可以控制更新的行数。