Aktualisieren Sie Tabellenwerte aus einer anderen Tabelle mit demselben Benutzernamen

74

Ich habe zwei Tabellen, mit einer gleichen Spalte mit dem Namen user_name, sagte table_a, table_b.

Ich möchte, kopieren von table_b, column_b_1, column_b2, bis table_b1, column_a_1, column_a_2bzw. wo die user_namedie gleiche ist, wie es in SQL - Anweisung zu tun?

Bin Chen
quelle

Antworten:

134

Solange Sie geeignete Indizes haben, sollte dies in Ordnung sein:

UPDATE table_a
SET
      column_a_1 = (SELECT table_b.column_b_1 
                            FROM table_b
                            WHERE table_b.user_name = table_a.user_name )
    , column_a_2 = (SELECT table_b.column_b_2
                            FROM table_b
                            WHERE table_b.user_name = table_a.user_name )
WHERE
    EXISTS (
        SELECT *
        FROM table_b
        WHERE table_b.user_name = table_a.user_name
    )

UPDATE in sqlite3 unterstützt keine FROM-Klausel, wodurch dies etwas mehr Arbeit als in anderen RDBMS macht.

Wenn die Leistung nicht zufriedenstellend ist, besteht eine andere Möglichkeit darin, neue Zeilen für table_a mithilfe einer Auswahl zu erstellen und mit table_a eine temporäre Tabelle zu erstellen. Löschen Sie dann die Daten aus table_a und füllen Sie sie aus dem temporären neu aus.

Martin Clayton
quelle
4
Ich musste den Teil table_a von der linken Seite des Set-Arguments ausschließen, damit dies funktioniert. Mit der obigen Antwort sieht es so auscolumn_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name )
Jim Geurts
Diese Antwort hilft, detaillierter zu verstehen, wie man eine Antwort kopiert, die unter stackoverflow.com/questions/17267417/…
zerocog
Wie oft wird der Join hier durchgeführt? nur 3 mal oder stattdessen 3 mal pro Zeile in table_a? (mein SQL ist rostig)
toto_tico
1
Beantwortung meiner eigenen Frage, es ist 3 Mal pro Zeile, siehe @Alejadro Antwort ...
toto_tico
Hallo, ich bin ein Neuling in SQL. Warum sind so viele WO-Ursachen notwendig?
Llamageddon
23

Ab der SQLite-Version 3.15 lässt die Syntax für UPDATE eine Spaltennamensliste im SET-Teil zu, sodass die Abfrage als geschrieben werden kann

UPDATE table_a
SET
    (column_a_1, column_a_2) = (SELECT table_b.column_b_1, table_b.column_b_2
                                FROM table_b
                                WHERE table_b.user_name = table_a.user_name )
WHERE
    EXISTS (
       SELECT *
       FROM table_b
       WHERE table_b.user_name = table_a.user_name
   )

Das ist nicht nur kürzer, sondern auch schneller

Alejadro Xalabarder
quelle
2

Es gibt eine noch viel bessere Lösung, um eine Tabelle von einer anderen Tabelle zu aktualisieren:

;WITH a AS
(
    SELECT
        song_id,
        artist_id
    FROM
        online_performance
)
UPDATE record_performance
SET
    op_song_id=(SELECT song_id FROM a),
    op_artist_id=(SELECT artist_id FROM a)

;
TheFlyingDutchMoose
quelle
1
Da das Obige nach bestimmten Zeilen sucht (record_id = 2347), müsste man den obigen Code 1000 Mal schreiben, um 1000 Zeilen zu aktualisieren?
Rasmus Larsen
1
Dies scheint vielversprechend, funktioniert jedoch nicht, wenn Sie beide Tabellen in einer gemeinsamen Spalte verknüpfen müssen (wie user_namein der ursprünglichen Frage). Stattdessen werden alle entsprechenden Werte in der Tabelle, die aktualisiert werden, auf die Werte nur eines Datensatzes in der Quelltabelle gesetzt. Es wurde versucht, die allgemeine Spalte aufzulisten und eine WHEREBedingung hinzuzufügen , aber es hat nicht funktioniert.
Aexl
1
UPDATE Eigentlich war mein Versuch richtig. Ich hatte möglicherweise eine zusätzliche Zeile in der Abfrage und es wurde aus irgendeinem Grund kein Fehler angezeigt, was mich verwirrte. Die Lösung bestand in der Tat darin, die erforderliche Spalte zur ersten Auswahl hinzuzufügen und dann alle anderen Auswahlen darauf verweisen zu lassen, z. B.(SELECT song_id FROM a WHERE guid=record_performance.guid)
aexl
2

Dies könnte mithilfe der folgenden UPDATE FROMSyntax erreicht werden :

UPDATE table_a
SET column_a_1 = table_b.column_b_1
   ,column_a_2 = table_b.column_b_2
FROM table_b
WHERE table_b.user_name = table_a.user_name;

Alternative:

UPDATE table_a
SET (column_a_1, column_a_2) = (table_b.column_b_1, table_b.column_b_2)
FROM table_b
WHERE table_b.user_name = table_a.user_name;

UPDATE FROM - SQLite Version 3.33.0

Die UPDATE-FROM-Idee ist eine Erweiterung von SQL, mit der eine UPDATE-Anweisung von anderen Tabellen in der Datenbank gesteuert werden kann. Die "Ziel" -Tabelle ist die spezifische Tabelle, die aktualisiert wird. Mit UPDATE-FROM können Sie die Zieltabelle mit anderen Tabellen in der Datenbank verknüpfen, um zu berechnen, welche Zeilen aktualisiert werden müssen und welche neuen Werte in diesen Zeilen enthalten sein sollten

Lukasz Szozda
quelle