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




wordpress title tag ändern (11)

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.


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.


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

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

Die folgende Anweisung mit dem Schlüsselwort FROM wird verwendet, um mehrere Zeilen mit einem Join zu aktualisieren

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

Teradata Aster bietet einen weiteren interessanten Weg, um das Ziel zu erreichen:

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 

Dies sollte in SQL Server funktionieren:

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

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


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;

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




sql-update