Lembre-se de resolver o erro uma vez: MySQL 1054-Coluna desconhecida na cláusula where

1. Introdução ao histórico

Esta é a minha mesa:

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| na        | text         | YES  |     | NULL    |       |
| birthDate | datetime     | YES  |     | NULL    |       |
| class     | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

Este é o código da tarefa que desejo concluir (objetivo: atualizar a classe de Zhang San para Li Si):

UPDATE test.student class 
SET class = ( SELECT class FROM student WHERE student.na = '李四') 
WHERE
	student.na = '张三'

2. Encontrar problemas, pesquisar, resolver problemas ...

1. O primeiro problema encontrado-1054:

1054-Unknown column'student.na 'in'where clause',
então excluí o código para solucionar possíveis erros

UPDATE test.student class 
SET class = 1
WHERE
	student.na = '张三'

Descobri que o erro acima ainda existe, exclua a cláusula where e execute-o. A mensagem de erro diz [linha 'student.na', não reconhecida], estou muito intrigado, mas quando excluo o nome da tabela anterior "aluno" e executo sucesso!

UPDATE test.student class 
SET class = 1
WHERE
	na = '张三'

Portanto, imaginei que o comando update limita uma determinada tabela e o nome da tabela não pode ser adicionado de forma supérflua antes do nome da coluna.

Então mudei o código completo para:

UPDATE test.student class 
SET class = ( SELECT class FROM student WHERE na = '李四') 
WHERE
	na = '张三'

2. Consulte também o erro -1093:

1093-Você não pode especificar a tabela de destino 'classe' para atualização na cláusula FROM.
Isso significa que você não pode selecionar certos valores na mesma tabela primeiro e, em seguida, atualizar a tabela (na mesma instrução),
que é o valor de o campo é julgado e, em seguida, o valor de um campo é atualizado.

Eu verifiquei na Internet e descobri que o MySQL não suporta este tipo de operação. Tudo é resolvido por "winding"
(de: https://zhidao.baidu.com/question/68619324.html).
Solução 1: Um
mais nível de aninhamento Subconsulta e, em seguida, exclua,
plano 2:
1. Crie uma tabela de retorno temporária, armazene automaticamente as condições a serem excluídas na tabela temporária:
2. Exclua os dados da tabela principal de acordo com a tabela temporária:
3. Finalmente, exclua o mesa temporária:

Não quero construir outra mesa, então usei a opção um:

UPDATE test.student class 
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') )
WHERE
	na = '张三'

Aninhei uma camada fora de [(SELECIONE classe de (____))]

3. Mas há outro problema - 1248:

(Eu disse, essa frustração vem com muita frequência, o design é tão pouco intuitivo e sujeito a erros, não é à toa que os programadores perdem o cabelo)
1248-Cada tabela derivada deve ter seu próprio alias
continuar a pesquisar ... Encontre a resposta: https: / / blog.csdn.net/cao478208248/article/details/28122113
"Esta frase significa que cada tabela derivada deve ter seu próprio alias ... O resultado da subconsulta é como Uma tabela derivada é usada para a consulta de nível superior, então o o resultado da subconsulta deve ter um alias "

Então, eu imitei e adicionei [as t]

UPDATE test.student class 
SET class = (SELECT class from( SELECT class FROM student WHERE na = '李四') as t )
WHERE
	na = '张三'

Finalmente executado com sucesso!

Acho que você gosta

Origin blog.csdn.net/sinat_27382047/article/details/106312751
Recomendado
Clasificación