Eu tenho uma consulta que funciona bem no MySQL, mas quando a executo no Oracle, recebo o seguinte erro:
Erro SQL: ORA-00933: O comando SQL não foi finalizado corretamente
00933. 00000 - "Comando SQL não foi finalizado corretamente"
A consulta é:
UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';
sql
oracle
inner-join
ora-00933
user169743
fonte
fonte
Respostas:
Essa sintaxe não é válida no Oracle. Você consegue fazer isso:
Ou você pode fazer isso:
Depende se a visualização em linha for considerada atualizável pelo Oracle ( para ser atualizável para a segunda instrução depende de algumas regras listadas aqui ).
fonte
Usa isto:
fonte
merge into table 1 t
e assim por diante.ON
,trg
é o alias da tabela principal (tabelatable1
"externa" pela sua lógica) e fazsrc
referência aoUSING
grupo ("tabela interna" pela sua lógica). Mas sim, provavelmente poderia ter sido melhor referenciado, mas eu fui capaz de segui-lo.MERGE
com aWHERE
cláusula:Você precisa da
WHERE
cláusula porque as colunas referenciadas naON
cláusula não podem ser atualizadas.fonte
fonte
Não use algumas das respostas acima.
Alguns sugerem o uso de SELECT aninhado, não faça isso, é terrivelmente lento. Se você tiver muitos registros para atualizar, use join, então algo como:
Veja este link para mais detalhes. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx .
Além disso, verifique se há chaves primárias em todas as tabelas nas quais você está ingressando.
fonte
Conforme indicado aqui , a sintaxe geral para a primeira solução proposta por Tony Andrews é:
Eu acho que isso é interessante, especialmente se você deseja atualizar mais de um campo.
fonte
Esta sintaxe a seguir funciona para mim.
fonte
SET
estava fazendo umREPLACE
e estava tentando colocar em branco uma sequência específica na coluna - resulta que o Oracle trata''
como nulo, e esse campo não pôde ser anulado. Eu pensei que a sintaxe estava apenas atualizando uma tabela temporária em vez da real, mas eu estava errado.Usando a descrição em vez de desc para a tabela2,
fonte
Funciona bem oracle
fonte
t1.First_Name = t2.FirstName, t1.Last_Name = t2.LastName
em uma tabela depois de correspondê-la na coluna "UserName" (t1.UserName = t2.UserName
) para recuperar o nome de uma tabela chamada UserInfo (select * from UserInfo) t2
). O banco de dados era o local onde estava usando UserName como uma chave primária para UserInfo em todos os lugares, em vez de colocar FirstName e LastName na tabela, diretamente. Isso consertou isso!fonte
fonte
Por uma questão de integridade, e porque estamos falando do Oracle, isso também pode ser feito:
fonte
A e B são campos de alias, você não precisa apontar a tabela.
fonte
fonte