Tabela 1:
id name desc
-----------------------
1 a abc
2 b def
3 c adf
Mesa 2:
id name desc
-----------------------
1 x 123
2 y 345
No oracle SQL, como executo uma consulta de atualização sql que pode atualizar a Tabela 1 com a Tabela 2 name
e desc
usar a mesma id
? Então o resultado final que eu obteria é
Tabela 1:
id name desc
-----------------------
1 x 123
2 y 345
3 c adf
A pergunta é tirada da atualização de uma tabela com dados de outra , mas especificamente para o Oracle SQL.
sql
oracle
sql-update
Muhd
fonte
fonte
Respostas:
Isso é chamado de atualização correlacionada
Supondo que a junção resulte em uma exibição preservada por chave, você também pode
fonte
WHERE EXISTS
impede de atualizar uma linhat1
se não houver uma linha correspondentet2
. Sem ele, todas as linhast1
serão atualizadas e os valores serão definidos comoNULL
se não houver nenhuma linha correspondentet2
. Isso geralmente não é o que você deseja que aconteça, portantoWHERE EXISTS
é geralmente necessário.SELECT ... FROM t2
deve ser uma linha única. Isso significa que você deve selecionar em todos os campos que compreendem uma chave exclusiva - uma chave primária não exclusiva não é suficiente. Sem exclusividade, você é reduzido a algo como o loop de @ PaulKarr - e, se não houver uma correlação exclusiva, mais de uma linha de destino poderá ser atualizada para cada linha de origem.table2
) está retornando várias linhas para um ou maistable1
valores e o Oracle não sabe qual você deseja usar. Normalmente, isso significa que você precisa refinar a subconsulta para que ela retorne uma única linha distinta.Tente o seguinte:
fonte
table1
etable2
for a mesma tabela, apenas cuide da cláusula -partON
e daWHERE
cláusulaSELECT
-sttable2
!experimentar
fonte
nunca funcionou para mim, pois o conjunto espera apenas 1 valor - Erro SQL: ORA-01427: a subconsulta de linha única retorna mais de uma linha.
aqui está a solução:
É exatamente assim que você o executa na planilha SQLDeveloper. Eles dizem que é lento, mas essa é a única solução que funcionou para mim neste caso.
fonte
Aqui parece haver uma resposta ainda melhor com a cláusula 'in' que permite várias chaves para a junção :
A questão é ter as colunas que você deseja usar como chave entre parênteses na cláusula where antes de 'in' e ter a instrução select com os mesmos nomes de coluna entre parênteses. onde ( coluna1, coluna2 ) em ( selecione ( coluna1, coluna2 ) da tabela onde "o conjunto que eu quero" );
fonte
404
)Se sua tabela t1 e seu backup t2 tiverem muitas colunas, aqui está uma maneira compacta de fazer isso.
Além disso, meu problema relacionado era que apenas algumas das colunas foram modificadas e muitas linhas não tinham edições nessas colunas, então eu queria deixá-las em paz - basicamente restaure um subconjunto de colunas de um backup de toda a tabela. Se você quiser apenas restaurar todas as linhas, pule a cláusula where.
Claro que a maneira mais simples seria excluir e inserir como select, mas no meu caso eu precisava de uma solução com apenas atualizações.
O truque é que, quando você seleciona * de um par de tabelas com nomes de colunas duplicados, a segunda será denominada _1. Então, aqui está o que eu vim com:
fonte
fonte