web-dev-qa-db-fra.com

Mettre à jour les valeurs de table à partir d'une autre table avec le même nom d'utilisateur

J'ai deux tables, avec une même colonne nommée user_name, en disant table_a, table_b.

Je veux, copier depuis table_b, column_b_1, column_b2, à table_b1, column_a_1, column_a_2, respectivement, où le user_name est le même, comment faire dans l'instruction SQL?

63
Bin Chen

Tant que vous disposez d'index appropriés, cela devrait fonctionner correctement:

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 sqlite ne prend pas en charge une clause FROM, ce qui en fait un peu plus de travail que dans les autres SGBDR.

Si les performances ne sont pas satisfaisantes, une autre option peut consister à créer de nouvelles lignes pour table_a à l'aide d'une sélection et à joindre avec table_a dans une table temporaire. Supprimez ensuite les données de table_a et remplissez à nouveau de données temporaires.

117
martin clayton

À partir de la version 3.15 de sqlite, la syntaxe pour UPDATE admet une liste de noms de colonnes dans la partie SET afin que la requête puisse être écrite comme

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
   )

ce qui est non seulement plus court mais aussi plus rapide

13
Alejadro Xalabarder

Il existe une bien meilleure solution pour mettre à jour une table à partir d'une autre table:

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

;
3
TheFlyingDutchMoose