Preciso atualizar esta tabela no SQL Server com dados da tabela 'pai', veja abaixo:
Tabela: venda
id (int)
udid (int)
assid (int)
Tabela: ud
id (int)
assid (int)
sale.assid
contém o valor correto para atualizar ud.assid
.
Que consulta fará isso? Estou pensando em um, join
mas não tenho certeza se é possível.
sql
sql-server
tsql
sql-server-2005
sql-update
Ant Swift
fonte
fonte
Respostas:
A sintaxe depende estritamente do SQL DBMS que você está usando. Aqui estão algumas maneiras de fazer isso em ANSI / ISO (também conhecido como DBMS), MySQL, SQL Server e Oracle. Esteja ciente de que meu método ANSI / ISO sugerido normalmente será muito mais lento que os outros dois métodos, mas se você estiver usando um DBMS SQL diferente do MySQL, SQL Server ou Oracle, esse poderá ser o único caminho a seguir (por exemplo, se o seu DBMS do SQL não suportar
MERGE
):ANSI / ISO:
MySQL:
Servidor SQL:
PostgreSQL:
Observe que a tabela de destino não deve ser repetida na
FROM
cláusula do Postgres.Oráculo:
SQLite:
fonte
set assid = s.assid
deveria serset u.assid = s.assid
.=
retorno mais de uma linha?update ud set assid = s.assid
Isso deve funcionar no SQL Server:
fonte
postgres
fonte
Uma abordagem SQL padrão seria
No SQL Server, você pode usar uma associação
fonte
WHERE
cláusula se desejar corresponder em colunas adicionais.PostgreSQL :
fonte
Consulta de atualização simplificada usando JOIN - em várias tabelas.
Nota - first_table, second_table, third_table e some_column como 123456 são nomes de tabelas de demonstração, nomes de colunas e IDs. Substitua-os pelos nomes válidos.
fonte
Outro exemplo de por que o SQL não é realmente portátil.
Para o MySQL seria:
Para obter mais informações, leia a atualização de várias tabelas: http://dev.mysql.com/doc/refman/5.0/en/update.html
fonte
O Teradata Aster oferece outra maneira interessante de como atingir o objetivo:
fonte
Eu estava pensando que o SQL Server na primeira publicação funcionaria para o Sybase, pois ambos são T-SQL, mas infelizmente não.
Para a Sybase, achei que a atualização precisa estar na própria tabela e não no alias:
fonte
A instrução a seguir com a palavra-chave FROM é usada para atualizar várias linhas com uma junção
fonte
MySQL
Você obterá o melhor desempenho se esquecer a cláusula where e colocar todas as condições na expressão ON.
Eu acho que isso ocorre porque a consulta primeiro tem que se juntar às tabelas e depois executa a cláusula where, portanto, se você pode reduzir o que é necessário para se juntar, essa é a maneira mais rápida de obter os resultados / fazer a atualização.
Exemplo
Cenário
Você tem uma tabela de usuários. Eles podem fazer login usando seu nome de usuário ou email ou número de conta. Essas contas podem estar ativas (1) ou inativas (0). Esta tabela possui 50000 linhas
Você tem uma tabela de usuários para desativar de uma só vez, porque descobre que todos fizeram algo ruim. Esta tabela, no entanto, possui uma coluna com nomes de usuário, e-mails e números de contas misturados. Ele também possui um indicador "has_run" que precisa ser definido como 1 (verdadeiro) quando executado
Inquerir
Raciocínio
Se tivéssemos que ingressar apenas nas condições OR, essencialmente seria necessário verificar cada linha quatro vezes para ver se deveria ingressar e, potencialmente, retornar muito mais linhas. No entanto, ao oferecer mais condições, ele pode "pular" muitas linhas se elas não atenderem a todas as condições ao ingressar.
Bônus
É mais legível. Todas as condições estão em um só lugar e as linhas a serem atualizadas estão em um só lugar
fonte
E no MS ACCESS:
fonte
A maneira mais simples é usar a Common Table Expression (CTE) introduzida no SQL 2005
fonte
fonte
Experimente este, acho que isso funcionará para você
fonte
Para SQLite, use a propriedade RowID para fazer a atualização:
fonte