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.
column_a_1 = (SELECT table_b.column_b_1 FROM table_b WHERE table_b.user_name = table_a.user_name )
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
quelle
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) ;
quelle
user_name
in 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 eineWHERE
Bedingung hinzuzufügen , aber es hat nicht funktioniert.(SELECT song_id FROM a WHERE guid=record_performance.guid)
Dies könnte mithilfe der folgenden
UPDATE FROM
Syntax 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;
quelle