PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Atualização do Postgres da junção esquerda


Aqui está uma maneira genérica de transformar esta consulta de atualização do formulário do servidor SQL para o PostgreSQL:
UPDATE Users
 SET bUsrActive = false
WHERE
 ctid IN (
   SELECT u.ctid FROM Users u
      LEFT JOIN Users u2 ON u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = 1 AND u2.bUsrActive = 1
    WHERE u.bUsrAdmin = 0 AND u.bUsrActive = 1 AND u2.nkUsr IS NULL
)

ctid é uma pseudocoluna que aponta para a localização única de uma linha. Você poderia usar a chave primária da tabela se ela tivesse uma.

A consulta nº 2 da pergunta não faz o que você espera porque a tabela atualizada Users nunca é associado à mesma tabela Users u na cláusula FROM. Assim como quando você coloca um nome de tabela duas vezes em uma cláusula FROM, eles não são unidos ou vinculados implicitamente, eles são considerados como dois conjuntos independentes de linhas.