Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Você não pode especificar a tabela de destino para atualização na cláusula FROM


O problema é que o MySQL, por qualquer motivo fútil, não permite que você escreva consultas como esta:
UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM myTable
    INNER JOIN ...
)

Ou seja, se você estiver fazendo um UPDATE /INSERT /DELETE em uma tabela, você não pode fazer referência a essa tabela em uma consulta interna (você pode no entanto, faça referência a um campo dessa tabela externa ...)

A solução é substituir a instância de myTable na subconsulta com (SELECT * FROM myTable) , assim
UPDATE myTable
SET myTable.A =
(
    SELECT B
    FROM (SELECT * FROM myTable) AS something
    INNER JOIN ...
)

Isso aparentemente faz com que os campos necessários sejam copiados implicitamente em uma tabela temporária, então é permitido.

Encontrei esta solução aqui . Uma nota desse artigo:

Você não quer apenas SELECT * FROM table na subconsulta na vida real; Eu só queria manter os exemplos simples. Na realidade, você deve selecionar apenas as colunas necessárias nessa consulta mais interna e adicionar um bom WHERE cláusula para limitar os resultados também.