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


Ich muss diese Tabelle aktualisieren SQL Server 2005 mit Daten aus seiner "Eltern" -Tabelle, siehe unten:

Verkauf

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

ud

id  (int)
assid  (int)

sale.assid enthält den korrekten zu aktualisierenden Wert ud.assid.

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


1022
2017-08-18 11:40


Ursprung


Antworten:


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 dies nicht unterstützt 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

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

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
 );

1925
2017-08-18 11:44



Dies sollte in SQL Server funktionieren:

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

110
2017-08-18 11:42



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 

82
2018-01-17 13:53



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

39
2017-08-18 11:44



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;

27
2018-03-07 21:35



Vereinfachte Aktualisierungsabfrage mit BEITRETENmehrere 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.


18
2017-07-14 07:15



Ein weiteres Beispiel, warum SQL nicht wirklich tragbar ist.

Für MySQL wäre es:

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

Für weitere Informationen lesen Sie das Update für mehrere Tabellen: http://dev.mysql.com/doc/refman/5.0/de/update.html

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

12
2017-11-16 19:17



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

8
2017-07-03 10:22



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

7
2017-11-19 08:24



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

5
2018-04-06 11:34