PostgreSQL查找不存在于另外两个表

时间:2016-06-01 19:53:51

标签: postgresql

我想在io_dl表中将io字段从1更改为0,仅当所有三个条件都成立时

io table pkey - > io_id

  1. io的pkey不在整个表m中,其中fkey名为m_id
  2. io的pkey未包含在表p,列p_id中,这是csv分隔的ids ex字符串。 " 1923,2309,210"
  3. io_dl表格中io字段的当前值设置为1
  4. 步骤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
    );
    

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 *,您可以控制更新的行数。