39 votes

Mettre à jour les lignes d'une table avec les données d'une autre table en fonction de l'égalité d'une colonne dans chacune d'elles.

Mise à jour plusieurs rangs dans une table à partir d'une autre table sur la base d'une colonne égale dans les deux tables (user_id).

les deux tables ont un user_id colonne. Vous devez insérer des données à partir de t2 en t1 lorsque le user_id sont égaux.

Merci d'avance pour toute aide offerte.

50voto

Dimitre Radoulov Points 9185
update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2
      ) = (
    select
      t2.column1, 
      t2.column2
    from
      table2  t2
    where
      t2.column1 = t1.column1
     )
    where exists (
      select 
        null
      from 
        table2 t2
      where 
        t2.column1 = t1.column1
      );

Ou ceci (si t2.column1 <=> t1.column1 sont plusieurs à un et n'importe lequel d'entre eux est bon) :

update 
  table1 t1
set
  (
    t1.column1, 
    t1.column2
      ) = (
    select
      t2.column1, 
      t2.column2
    from
      table2  t2
    where
      t2.column1 = t1.column1
    and
      rownum = 1    
     )
    where exists (
      select 
        null
      from 
        table2 t2
      where 
        t2.column1 = t1.column1
      );

25voto

Tony Andrews Points 67363

Si vous voulez mettre à jour les lignes correspondantes dans t1 avec les données de t2 alors :

update t1
set (c1, c2, c3) = 
(select c1, c2, c3 from t2
 where t2.user_id = t1.user_id)
where exists
(select * from t2
 where t2.user_id = t1.user_id)

La partie "where exists" a pour but d'empêcher la mise à jour des colonnes t1 à null lorsqu'aucune correspondance n'existe.

14voto

schurik Points 4452
merge into t2 t2 
using (select * from t1) t1
on (t2.user_id = t1.user_id)
when matched then update
set
   t2.c1 = t1.c1
,  t2.c2 = t1.c2

6voto

Ollie Points 8526

Il ne s'agit pas d'une insertion si l'enregistrement existe déjà dans t1 (l'identifiant de l'utilisateur correspond), à moins que vous ne vouliez créer des identifiants d'utilisateur en double.

Vous voulez peut-être une mise à jour ?

UPDATE t1
   SET <t1.col_list> = (SELECT <t2.col_list>
                          FROM t2
                         WHERE t2.user_id = t1.user_id)
 WHERE EXISTS
      (SELECT 1
         FROM t2
        WHERE t1.user_id = t2.user_id);

J'espère que cela vous aidera...

2voto

Vous pouvez toujours utiliser et laisser de côté la section "quand elle n'est pas appariée".

merge into table1 FromTable   
   using table2 ToTable
     on     ( FromTable.field1 = ToTable.field1
          and  FromTable.field2 =ToTable.field2)
when Matched then
update set 
  ToTable.fieldr = FromTable.fieldx,
  ToTable.fields = FromTable.fieldy, 
  ToTable.fieldt =  FromTable.fieldz)
when not matched then
  insert  (ToTable.field1,
       ToTable.field2,
       ToTable.fieldr,
       ToTable.fields,
       ToTable.fieldt)
  values (FromTable.field1,
         FromTable.field2,
         FromTable.fieldx,
         FromTable.fieldy,
         FromTable.fieldz);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X