tabelas - Como posso fazer uma instrução UPDATE com JOIN no SQL?




update inner join 3 tabelas (10)

Eu preciso atualizar esta tabela no SQL Server 2005 com dados de sua tabela 'pai', veja abaixo:

venda

id (int)
udid (int)
assid (int)

ud

id  (int)
assid  (int)

sale.assid contém o valor correto para atualizar o ud.assid .

Qual consulta fará isso? Estou pensando em join mas não tenho certeza se é possível.


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 é porque a consulta primeiro tem que juntar as tabelas, em seguida, executa a cláusula where em que, então, se você pode reduzir o que é necessário para participar, então é a maneira mais rápida de obter os resultados / fazer o udpate.

Exemplo

Cenário

Você tem uma tabela de usuários. Eles podem fazer login usando seu nome de usuário ou e-mail ou account_number. Essas contas podem estar ativas (1) ou inativas (0). Esta tabela tem 50000 linhas

Você então tem uma tabela de usuários para desativar de uma só vez, porque você descobre que todos eles fizeram algo ruim. Esta tabela, no entanto, tem uma coluna com nomes de usuários, emails e números de contas misturados. Ele também tem um indicador "has_run" que precisa ser definido como 1 (verdadeiro) quando tiver sido executado

Inquerir

UPDATE users User
    INNER JOIN
        blacklist_users BlacklistUser
        ON
        (
            User.username = BlacklistUser.account_ref
            OR
            User.email = BlacklistedUser.account_ref
            OR
            User.phone_number = BlacklistUser.account_ref
            AND
            User.is_active = 1
            AND
            BlacklistUser.has_run = 0
        )
    SET
        User.is_active = 0,
        BlacklistUser.has_run = 1;

Raciocínio

Se tivéssemos que participar apenas das condições OR, seria essencialmente necessário verificar cada linha 4 vezes para ver se ela deveria se juntar, e potencialmente retornar muito mais linhas. No entanto, dando-lhe mais condições, pode "pular" muitas linhas se elas não atenderem a todas as condições ao entrar.

Bônus

É mais legível. Todas as condições estão em um só lugar e as linhas a atualizar estão em um só lugar


A seguinte instrução com a palavra-chave FROM é usada para atualizar várias linhas com uma junção

UPDATE users 
set users.DivisionId=divisions.DivisionId
from divisions join users on divisions.Name=users.Division

Consulta de atualização simplificada usando JOIN -ing de várias tabelas.

   UPDATE
        first_table ft
        JOIN second_table st ON st.some_id = ft.some_id
        JOIN third_table tt  ON tt.some_id = st.some_id
        .....
    SET
        ft.some_column = some_value
    WHERE ft.some_column = 123456 AND st.some_column = 123456

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.


E no MS ACCESS:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;

Isso deve funcionar no SQL Server:

update ud 
set assid = sale.assid
from sale
where sale.udid = id

Outro exemplo porque o SQL não é realmente portátil.

Para o MySQL seria:

update ud, sale
set ud.assid = sale.assid
where sale.udid = ud.id;

Para mais informações, leia a atualização de várias tabelas: http://dev.mysql.com/doc/refman/5.0/en/update.html

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]

Tente este, acho que isso vai funcionar para você

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null

Teradata Aster oferece outra maneira interessante de alcançar o objetivo:

MERGE INTO ud --what trable should be updated
USING sale -- from what table/relation update info should be taken
ON ud.id = sale.udid --join condition
WHEN MATCHED THEN 
    UPDATE SET ud.assid = sale.assid; -- how to update

postgres

UPDATE table1
SET    COLUMN = value
FROM   table2,
       table3
WHERE  table1.column_id = table2.id
       AND table1.column_id = table3.id
       AND table1.COLUMN = value
       AND table2.COLUMN = value
       AND table3.COLUMN = value 

PostgreSQL :

CREATE TABLE ud (id integer, assid integer);
CREATE TABLE sales (id integer, udid integer, assid integer);

UPDATE ud
SET assid = sales.assid
FROM sales
WHERE sales.id = ud.id;




sql-update