Eu tenho um conjunto de dados realmente terrível que herdei e parte do meu trabalho é revisá-lo e limpá-lo para algo que seja realmente utilizável. Atualmente, estou tentando atualizar uma coluna em minha tabela com base no nome da entrada.
Tabela: (a categoria atualmente é nula para quase tudo)
+-----------------------------------------------------+
| programID | programName | programVersion | category |
+-----------------------------------------------------+
Minha consulta:
update Programs
set category="Adobe Suites"
where programName
in (
select distinct programName
from Programs
where programName regexp '^adobe.*cs[1-9]$'
);
O problema é que não importa o que eu tente, continuo recebendo o erro:
ERRO 1093 (HY000): Você não pode especificar a tabela de destino 'Programas' para atualização na cláusula FROM
Não tenho certeza de que outra maneira isso poderia ser feito. Alguma ideia de como substituir a declaração from por outra coisa?
SUGESTÃO #1
Por que usar uma subconsulta? Tente assim:
PRÓS E CONTRAS: consulta mais simples sem subconsulta, mas uma verificação de tabela completa de passagem única.
SUGESTÃO #2
Coloque os nomes distintos em uma tabela separada e faça um
UPDATE JOIN
:PRÓS E CONTRAS: Limpo
UPDATE JOIN
, mas requer a criação manual da tabela temporária. Isso será ótimo seprogramName
estiver indexado naPrograms
tabela.EMBARGO
Há uma grande razão pela qual você recebe essa mensagem de erro. Tem a ver com o MySQL Query Optimizer. Em 22 de fevereiro de 2011, escrevi uma resposta para esta postagem: Problema com a subconsulta do MySQL . Mencionei que há momentos em que o MySQL Query Optimizer pode fazer com que as linhas desapareçam intermitentemente no processo de otimização. A junção não seria limpa internamente. Portanto, em vez de reescrevê-lo, o MySQL simplesmente dispara um erro para não ter que reescrever. IMHO, acho que talvez devido à maneira como o MySQL interage com os mecanismos de armazenamento.
De uma chance !!!
Eu realmente não entendo por que você está usando essa subconsulta inútil, isso pode ser feito simplesmente por esta consulta básica:
não é mesmo?