Eu tenho duas mesas:
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
sempre será um subconjunto de B
(ou seja, todas as colunas de A
também estão dentro B
).
Quero atualizar um registro com um específico ID
no B
com os seus dados a partir A
de todas as colunas de A
. Isso ID
existe em A
e B
.
Existe uma UPDATE
sintaxe ou qualquer outra maneira de fazer isso sem especificar os nomes das colunas, apenas dizendo "definir todas as colunas de A" ?
Como estou usando o PostgreSQL, um comando não padrão específico também é aceito (no entanto, não é preferido).
Respostas:
Você pode usar a cláusula FROM não padrão .
fonte
A pergunta é antiga, mas eu senti que a melhor resposta ainda não havia sido dada.
Solução geral com SQL dinâmico
Você não precisa saber nenhum nome de coluna, exceto algumas colunas exclusivas para ingressar (
id
no exemplo). Funciona de forma confiável para qualquer possível gabinete de canto em que eu possa pensar.Isso é específico do PostgreSQL. Estou construindo código dinâmico com base no information_schema , em particular na tabela
information_schema.columns
, definida no padrão SQL e na maioria dos principais RDBMS (exceto Oracle). Mas umaDO
declaração com o código PL / pgSQL executando SQL dinâmico é uma sintaxe PostgreSQL totalmente fora do padrão.Assumindo uma coluna correspondente
b
para cada colunaa
, mas não o contrário.b
pode ter colunas adicionais.WHERE b.id = 123
é opcional, para atualizar uma linha selecionada.SQL Fiddle.
Respostas relacionadas com mais explicações:
Soluções parciais com SQL simples
Com lista de colunas compartilhadas
Você ainda precisa conhecer a lista de nomes de colunas que as duas tabelas compartilham. Com um atalho de sintaxe para atualizar várias colunas - menor que o que as outras respostas sugeriram até agora em qualquer caso.
SQL Fiddle.
Essa sintaxe foi introduzida no Postgres 8.2 em 2006, muito antes da pergunta ser feita. Detalhes no manual.
Palavras-chave:
Com lista de colunas em
B
Se todas as colunas de
A
estiverem definidasNOT NULL
(mas não necessariamenteB
)e você souber os nomes das colunas de
B
(mas não necessariamenteA
).A
NATURAL LEFT JOIN
junta-se uma linha deb
onde todas as colunas com o mesmo nome segurar mesmos valores. Não precisamos de atualização neste caso (nada muda) e podemos eliminar essas linhas no início do processo (WHERE b.id IS NULL
).Ainda precisamos encontrar uma linha correspondente, portanto,
b.id = ab.id
na consulta externa.db <> mexe aqui
Old sqlfiddle.
Este é o SQL padrão, exceto a
FROM
cláusula .Funciona independentemente de qual das colunas estiver realmente presente
A
, mas a consulta não pode distinguir entre valores NULL reais e colunas ausentesA
, portanto, só é confiável se todas as colunasA
estiverem definidasNOT NULL
.Existem várias variações possíveis, dependendo do que você sabe sobre as duas tabelas.
fonte
SET (column1) = (a.column)
) Postgres irá tratá-lo como um outro tipo de atualização e dar e erro como este:source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
Trabalho com o banco de dados IBM DB2 há mais de uma década e agora estou tentando aprender o PostgreSQL.
Ele funciona no PostgreSQL 9.3.4, mas não no DB2 10.5:
Nota: O principal problema é da causa FROM que não é suportada no DB2 e também não no ANSI SQL.
Ele funciona no DB2 10.5, mas NÃO funciona no PostgreSQL 9.3.4:
FINALMENTE! Ele funciona no PostgreSQL 9.3.4 e no DB2 10.5:
fonte
B
, a primeira instrução não fará nada (a linha original permanece intocada), enquanto as outras duas sobrescrevem colunas com valores NULL.Esta é uma grande ajuda. O código
funciona perfeitamente.
observou que você precisa de um suporte "" no
para fazer funcionar.
fonte
Não necessariamente o que você pediu, mas talvez o uso da herança do postgres possa ajudar?
Isso evita a necessidade de atualização B.
Mas não deixe de ler todos os detalhes .
Caso contrário, o que você solicita não é considerado uma boa prática - coisas dinâmicas, como visualizações com,
SELECT * ...
são desencorajadas (como essa pequena conveniência pode quebrar mais coisas do que ajudar), e o que você solicita seria equivalente aoUPDATE ... SET
comando.fonte
você pode criar e executar sql dinâmico para fazer isso, mas não é realmente ideal
fonte
Tente seguir
EDITADO: - Atualize mais de uma coluna
fonte
UPDATE
no MySQL , mas é inválida para o PostgreSQL.