it-swarm.com.de

Wie kann ich eine UPDATE-Anweisung mit JOIN in SQL ausführen?

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

Verkauf

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

d

id  (int)
assid  (int)

sale.assid enthält den korrekten Wert zum Aktualisieren von ud.assid.

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

1238
Ant Swift

Die Syntax hängt streng davon ab, welches SQL-DBMS Sie verwenden. Hier sind einige Möglichkeiten, dies in ANSI/ISO (auch bekannt als SQL DBMS), MySQL, SQL Server und Oracle zu tun. Beachten Sie, dass meine vorgeschlagene ANSI/ISO-Methode in der Regel viel 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 der einzige Weg (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

PostgreSQL:

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

Beachten Sie, dass die Zieltabelle in der FROM -Klausel für Postgres nicht wiederholt werden darf.

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

Dies sollte in SQL Server funktionieren:

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

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 
92
user1154043

Ein Standard-SQL-Ansatz wäre

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

Unter SQL Server können Sie einen Join verwenden

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

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;
35
alfonx

Vereinfachte Aktualisierungsabfrage mit JOIN - 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

Anmerkung - first_table, second_table, third_table und some_column wie 123456 sind Namen von Demo-Tabellen, Spalten und IDs. Ersetzen Sie sie durch die gültigen Namen.

23
Vinit Kadkol

Ein weiteres Beispiel, warum SQL nicht wirklich portabel ist.

Für MySQL wäre es:

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

Weitere Informationen finden Sie unter Aktualisierung mehrerer Tabellen: 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]
14
Yada

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
7
xhudik

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 der Tabelle selbst und nicht auf dem Alias ​​liegen muss:

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

MySQL

Sie erzielen die beste Leistung, wenn Sie die where-Klausel vergessen und alle Bedingungen in den ON-Ausdruck einfügen.

Ich denke, das liegt daran, dass die Abfrage zuerst die Tabellen verknüpfen muss und dann die WHERE-Klausel dazu ausführt. Wenn Sie also die für die Verknüpfung erforderlichen Elemente reduzieren können, ist dies der schnellste Weg, um die Ergebnisse zu ermitteln/die Aktualisierung durchzuführen.

Beispiel

Szenario

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

Sie haben dann eine Benutzerliste, die Sie auf einmal deaktivieren können, weil Sie herausfinden, dass sie alle etwas Schlechtes getan haben. Diese Tabelle enthält jedoch eine Spalte mit gemischten Benutzernamen, E-Mails und Kontonummern. Es hat auch ein "has_run" -Indikator, der auf 1 (wahr) gesetzt werden muss, wenn es 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 unter den Bedingungen OR beitreten müssten, müsste im Wesentlichen jede Zeile viermal überprüft werden, um festzustellen, ob sie beitreten sollte, und möglicherweise viel mehr Zeilen zurückgeben. Wenn es jedoch mehr Bedingungen gibt, kann es viele Zeilen "überspringen", wenn sie beim Beitritt nicht alle Bedingungen erfüllen.

Bonus

Es ist besser lesbar. Alle Bedingungen befinden sich an einer Stelle, und die zu aktualisierenden Zeilen befinden sich an einer Stelle

6
Luke Watts

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
Sheryar Nizar

Und in MS Access:

UPDATE ud 
INNER JOIN sale ON ud.id = sale.udid
SET ud.assid = sale.assid;
3
Richard
UPDATE tblAppraisalBasicData
SET tblAppraisalBasicData.ISCbo=1
FROM tblAppraisalBasicData SI INNER JOIN  aaa_test RAN ON SI.EmpID = RAN.ID
2
Abdullah Yousuf

Verwenden Sie für SQLite die RowID-Eigenschaft, um das Update durchzuführen:

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');
1
KeithTheBiped

Am einfachsten ist die Verwendung von dem in SQL 2005 eingeführten Common Table Expression (CTE)

with cte as
(select u.assid col1 ,s.assid col2 from ud u inner join sale s on u.id = s.udid)
update cte set col1=col2
1
Kemal AL GAZZAH

Versuchen Sie dieses, ich denke, dass dieses für Sie arbeitet

update ud

set ud.assid = sale.assid

from ud 

Inner join sale on ud.id = sale.udid

where sale.udid is not null
1
HARSHIT RATHORE