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
    字段的当前值设置为1
  • 我想第3步是不需要的,因为将0设置为0并不会真的搞乱任何事情,额外的检查可能会减慢查询速度

    这就是我尝试过的,我得到了一个相同的
    io\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*
    可以控制更新了多少行