trigger - Come posso eseguire un'istruzione UPDATE con JOIN in SQL?




update e set (10)

Ho bisogno di aggiornare questa tabella in SQL Server 2005 con i dati dalla sua tabella 'padre', vedi sotto:

saldi

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

ud

id  (int)
assid  (int)

sale.assid contiene il valore corretto per aggiornare ud.assid .

Quale query lo farà? Sto pensando a join ma non sono sicuro che sia possibile.


MySQL

Otterrai le migliori prestazioni se dimentichi la clausola where e inserisci tutte le condizioni nell'espressione ON.

Penso che questo sia dovuto al fatto che la query deve prima unire le tabelle e quindi eseguire la clausola where, quindi se è possibile ridurre ciò che è richiesto per unirsi, questo è il modo digiuno per ottenere i risultati / eseguire l'udpate.

Esempio

Scenario

Hai una tabella di utenti. Possono accedere utilizzando il loro nome utente o email o numero di conto. Questi account possono essere attivi (1) o inattivi (0). Questa tabella ha 50000 righe

Poi hai una tabella di utenti da disabilitare in un colpo solo perché scopri di aver fatto qualcosa di male. Questa tabella ha tuttavia una colonna con nomi utente, e-mail e numeri di account misti. Ha anche un indicatore "has_run" che deve essere impostato su 1 (true) quando è stato eseguito

domanda

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;

Ragionamento

Se dovessimo aderire solo alle condizioni OR, in sostanza bisognerebbe controllare ogni riga 4 volte per vedere se dovrebbe aderire e potenzialmente restituire molte più righe. Tuttavia, dandogli più condizioni può "saltare" molte righe se non soddisfano tutte le condizioni quando si uniscono.

indennità

È più leggibile. Tutte le condizioni sono in un posto e le righe da aggiornare si trovano in un unico posto


E in MS ACCESS:

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

La sintassi dipende strettamente da quale DBMS SQL stai usando. Ecco alcuni modi per farlo in ANSI / ISO (alias dovrebbe funzionare su qualsiasi DBMS SQL), MySQL, SQL Server e Oracle. Tieni presente che il mio metodo ANSI / ISO suggerito sarà in genere molto più lento rispetto agli altri due metodi, ma se utilizzi un DBMS SQL diverso da MySQL, SQL Server o Oracle, allora potrebbe essere l'unica via da percorrere (ad es. se il tuo DBMS SQL non supporta MERGE ):

ANSI / ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

Server SQL:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

Oracolo:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

Per SQLite utilizzare la proprietà RowID per effettuare l'aggiornamento:

update Table set column = 'NewValue'
where RowID = 
(select t1.RowID from Table t1
join Table2 t2 on t1.JoinField = t2.JoinField
where t2.SelectValue = 'FooMyBarPlease');

Query di aggiornamento semplificata usando JOIN -in più tabelle.

   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 come 123456 sono nomi di tabelle demo, nomi di colonne e ID. Sostituiscili con i nomi validi.


Questo dovrebbe funzionare in SQL Server:

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

Stavo pensando che quello di SQL Server nel post superiore funzionerebbe per Sybase dato che sono entrambi T-SQL ma sfortunatamente no.

Per Sybase ho trovato che l'aggiornamento deve essere sul tavolo stesso e non l'alias:

update ud
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

Teradata Aster offre un altro modo interessante per raggiungere l'obiettivo:

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

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;

UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID




sql-update