ändern - Wie kann ich eine UPDATE-Anweisung mit JOIN in SQL machen?




wordpress title tag ändern (9)

Ich muss diese Tabelle in SQL Server 2005 mit Daten aus der 'übergeordneten' Tabelle aktualisieren, siehe unten:

Verkauf

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

ud

id  (int)
assid  (int)

sale.assid enthält den korrekten Wert für die Aktualisierung von ud.assid .

Welche Abfrage wird das tun? Ich denke an einen join aber ich bin mir nicht sicher, ob es möglich ist.


MySQL

Sie erhalten die beste Leistung, wenn Sie die WHERE-Klausel vergessen und alle Bedingungen in den ON-Ausdruck setzen.

Ich denke, das liegt daran, dass die Abfrage zuerst den Tabellen beitreten und dann die WHERE-Klausel ausführen muss. Wenn Sie also reduzieren können, was für die Verknüpfung erforderlich ist, ist dies der schnellste Weg, um die Ergebnisse zu erhalten / tun Sie das UDPATE.

Beispiel

Szenario

Sie haben eine Tabelle mit Benutzern. Sie können sich mit ihrem Benutzernamen oder ihrer E-Mail-Adresse oder ihrer Kontonummer anmelden. Diese Konten können aktiv (1) oder inaktiv (0) sein. Diese Tabelle hat 50000 Zeilen

Sie haben dann eine Tabelle mit Benutzern, die Sie auf einmal deaktivieren können, weil Sie feststellen, dass sie alle etwas Schlechtes getan haben. Diese Tabelle enthält jedoch eine Spalte mit Benutzernamen, E-Mails und Kontonummern. Es hat auch einen "has_run" Indikator, der auf 1 (wahr) gesetzt werden muss, wenn er ausgeführt wurde

Abfrage

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;

Argumentation

Wenn wir nur den OR-Bedingungen beitreten müssten, müsste es im Wesentlichen jede Zeile 4 Mal überprüfen, um zu sehen, ob es sich anschließen sollte, und möglicherweise viel mehr Zeilen zurückgeben. Wenn es jedoch mehr Bedingungen gibt, kann es viele Zeilen "überspringen", wenn sie nicht alle Bedingungen beim Beitritt erfüllen.

Bonus

Es ist lesbarer. Alle Bedingungen befinden sich an einem Ort und die zu aktualisierenden Zeilen befinden sich an einem Ort


Die Syntax hängt ausschließlich davon ab, welches SQL-DBMS Sie verwenden. Hier sind einige Möglichkeiten, dies in ANSI / ISO zu tun (aka sollte mit jedem SQL DBMS funktionieren), MySQL, SQL Server und Oracle. Beachten Sie, dass meine vorgeschlagene ANSI / ISO-Methode in der Regel wesentlich langsamer ist als die beiden anderen Methoden. Wenn Sie jedoch ein anderes SQL DBMS als MySQL, SQL Server oder Oracle verwenden, ist dies möglicherweise die einzige Möglichkeit (z. B. Wenn Ihr SQL-DBMS MERGE nicht unterstützt):

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

SQL Server:

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

Orakel:

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

Dies sollte in SQL Server funktionieren:

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

Ein Standard-SQL-Ansatz wäre

UPDATE ud
SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id)

Auf SQL Server können Sie eine Verknüpfung verwenden

UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id

Ich dachte, der SQL-Server im oberen Post würde für Sybase funktionieren, da beide T-SQL sind, aber leider nicht.

Für Sybase habe ich festgestellt, dass das Update auf dem Tisch selbst und nicht im Alias ​​vorhanden sein muss:

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

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 

Und in MS ACCESS:

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

Vereinfachte Aktualisierungsabfrage unter Verwendung von JOIN - bei mehreren Tabellen.

   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

Hinweis - first_table, second_table, third_table und some_column wie 123456 sind Beispieltabellennamen, Spaltennamen und IDs. Ersetzen Sie sie durch die gültigen Namen.


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




sql-update