代码之家  ›  专栏  ›  技术社区  ›  Luiz Henrique

具有count(*)的Update子句

  •  0
  • Luiz Henrique  · 技术社区  · 4 年前

    SELECT a.protocol_number, b.STATUS_NAME, COUNT(*) FROM PARTICIPANTS a LEFT JOIN PROTOCOLS b ON a.PROTOCOL_NUMBER = b.PROTOCOL_NUMBER GROUP BY a.PROTOCOL_NUMBER, b.STATUS_NAME HAVING count(*) = 1 AND b.STATUS_NAME = 'OPEN';
    

    我想将这些协议的状态更新为CLOSED,但找不到运行正常的查询。我试过这个但它永远挂着:

    UPDATE
        PROTOCOLS p1
    SET
        p1.STATUS_NAME = 'CLOSED'
    WHERE
        p1.protocol_Number IN (
        SELECT
            PROTOCOL_NUMBER
        FROM
            (
            SELECT
                a.protocol_number, b.STATUS_NAME, COUNT(*)
            FROM
                PARTICIPANTS a
            LEFT JOIN PROTOCOLS b ON
                a.PROTOCOL_NUMBER = b.PROTOCOL_NUMBER
            GROUP BY
                a.PROTOCOL_NUMBER, b.STATUS_NAME
            HAVING
                count(*) = 1
                AND b.STATUS_NAME = 'OPEN');
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Lars Skaug    4 年前

    假设状态名称“OPEN”只分配给一个 PROTOCOL_NUMBER .

    UPDATE
        PROTOCOLS p1
    SET
        p1.STATUS_NAME = 'CLOSED'
    WHERE
        STATUS_NAME = 'OPEN'
        and not exists (select null
                    from protocols p2
                    where p2.PROTOCOL_NUMBER = p1.PROTOCOL_NUMBER
                     and b.STATUS_NAME <> 'OPEN');
    
        2
  •  0
  •   Sujitmohanty30    4 年前

    假设你有索引 protocol_number

    update protocols p1
       set p1.status_name = 'CLOSED'
     where p1.status_name = 'OPEN'
       and exists (select 1
                     from participants a
                    where a.protocol_number = b.protocol_number
                    group by a.protocol_number
                    having count(*) = 1)