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?
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.
À 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
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)
;