1つのテーブルの行を、それぞれが等しい場合の1つの列に基づいて別のテーブルのデータで更新する

各行が等しい(user_id)列に基づいて、別の表から 多数の行 を1つの表に更新します。

どちらの表にも user_id 列があります。 user_id 列が等しい場合、 t2 から t1 にデータを挿入する必要があります。

提供されたヘルプについては、事前にありがとうございます。

37
Upvoted。関連する質問をご覧ください: stackoverflow.com/q/7030699/435605
追加された 著者 AlikElzin-kilaka,

5 答え

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

Or this (if t2.column1 <=> t1.column1 are many to one and anyone of them is good):

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
      ); 
50
追加された
この回答は、必要以上に多くの行を更新します。追加の が必要です。トニー・アンドリュースの答えを参照してください。
追加された 著者 AlikElzin-kilaka,
@ AlikElzin-kilaka、修正、間違いを指摘してくれてありがとう!
追加された 著者 Dimitre Radoulov,
@ジョンローズ、あなたは大歓迎です!
追加された 著者 Dimitre Radoulov,
これ以外にも、これ以外にも多くの答えがありますが、これが私のために働いたのは唯一のもので、私のベーコンは救われました。ありがとうございました!
追加された 著者 Ian,
どうもありがとうございました。重複を排除するためにデータが修正された後、魅力のように動作します!
追加された 著者 JcR49,
この回答は正解で非常に役立ちます。ありがとうございました。
追加された 著者 JcR49,

t1の一致する行をt2のデータで更新する場合は、次のようにします。

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)

「存在する」部分は、一致が存在しない場合にt1列をヌルに更新しないようにします。

25
追加された
Upvoted。同様の回答を参照してください: stackoverflow.com/a/7031405/435605
追加された 著者 AlikElzin-kilaka,
これは私を助けました、ありがとう!
追加された 著者 AndeeC,
だから、user_idはt1では一意ではないのですか?その場合、値を取得するには t1をどのように知っていますか?
追加された 著者 Tony Andrews,
「単一行の問合せが多数の行を戻す」というエラーは、一部のuser_idには2つ(またはそれ以上)の行がt2にあることを意味します。だからあなたの最後のコメントが間違っているか、あなたのデータベースが壊れています!
追加された 著者 Tony Andrews,
Where Existsは、データのサブセットのみを持つ小さなテーブルからより大きなテーブルに更新する場合に特に重要です。大幅なスピードブースト。
追加された 著者 AnthonyVO,
私はこれを正確にオペレートしているとは確信していません....この回答は正解で非常に役立ちます。ありがとうございました。
追加された 著者 JcR49,
ありがとうございました。正常に動作します。
追加された 著者 JcR49,
ありがとうございます.....ただ一つであるべきです...私はもっと慎重に見えると述べたはずです。私は助けに感謝します。
追加された 著者 JcR49,
はい、各user_idは1つだけです。どちらの表にもuser_idの列が1つあり、一致するエントリがありますが、ユーザーごとに1つのuser_idしかありません。
追加された 著者 JcR49,
更新されるべき行は、およそ1000行あります。
追加された 著者 JcR49,
ありがとうございました。私が試した他のクエリのように、これは '単一行クエリrturns多くの行'を返します..挿入/更新するものはありません。
追加された 著者 JcR49,
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
14
追加された

重複したuser_idを作成しない限り、レコードがすでにt1に存在する場合は挿入されません(user_idが一致します)。

更新が必要な場合がありますか?

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

それが役に立てば幸い...

5
追加された
関係が1対1でない場合は、ORA-01427エラーが発生します。つまり、equijoin文が表1の1つのレコードと表2の1つのレコードを正常に一致させることはできません。
追加された 著者 Nathan,
ORA-01427:単一行副問合せは複数の行を戻します
追加された 著者 JcR49,
私は同じoraに戻ってくる01427単一行のクエリは、複数の行を返します。
追加された 著者 JcR49,

あなたはいつでも「一致しないときは」セクションを使用して除外することができました

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);
2
追加された