Bir tablodaki satırları, her biri aynı olan bir sütuna dayalı olarak başka bir tablodaki verilerle güncelleyin

çok sayıda satır 'ı bir tablodaki her bir sütuna dayalı olarak (kullanıcı_kimliği) bir tabloya güncelleyin.

her iki tablonun bir user_id sütunu vardır. user_id sütunu eşit olduğunda, t2 öğesinden t1 öğesine veri eklemeniz gerekir.

Sunulan herhangi bir yardım için şimdiden teşekkür ederiz.

37
Upvoted. İlgili soruya bakın: stackoverflow.com/q/7030699/435605
katma yazar AlikElzin-kilaka, kaynak

5 cevap

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
katma
Bu cevap, ihtiyaç duyulandan daha fazla satırı günceller. Ek burada gereklidir. Tony Andrews'ın cevabına bakınız.
katma yazar AlikElzin-kilaka, kaynak
@ AlikElzin-kilaka, düzeltildi, hatayı işaretlediğiniz için teşekkürler!
katma yazar Dimitre Radoulov, kaynak
@JohnRose, rica ederim!
katma yazar Dimitre Radoulov, kaynak
Başka bir yerde bu SO için başka cevaplar var ama bu benim için çalışan tek şeydi ve pastırmamı kurtardı. Teşekkür ederim!
katma yazar Ian, kaynak
Çok teşekkür ederim. Yinelenenleri ortadan kaldırmak için veriler düzeltildikten sonra bir çekicilik gibi çalışır !!!
katma yazar JcR49, kaynak
Bu cevap doğru ve çok yararlı. Teşekkür ederim.
katma yazar JcR49, kaynak

T1'deki eşleşen satırları t2'den verilerle güncellemek isterseniz:

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)

"Var olan" bölümü, t1 sütunlarının hiçbir eşleşme bulunmadığında null olarak güncellenmesini engellemek için kullanılır.

25
katma
Upvoted. Benzer bir yanıta bakın: stackoverflow.com/a/7031405/435605
katma yazar AlikElzin-kilaka, kaynak
Bu bana yardım etti, teşekkürler!
katma yazar AndeeC, kaynak
Yani user_id t1'de benzersiz değil mi? Bu durumda, değerleri almak için t1 t1'i nereden biliyorsunuz?
katma yazar Tony Andrews, kaynak
"Tek satırlı sorgu çok satır döndürür" hatası, bazı user_id öğelerinin t2'de 2 (veya daha fazla) satırı bulunduğunu belirtir. Yani son yorumunuz yanlıştı ya da veritabanınız bozuk!
katma yazar Tony Andrews, kaynak
Bulunduğunuz yer, özellikle daha küçük bir tablodan daha küçük bir tabloya sahip olan daha küçük bir tablodan güncelleme yapıyorsanız, önemli bir bölümdür. Önemli hız artışı.
katma yazar AnthonyVO, kaynak
Bunun doğru şekilde çalıştığından emin değilim .... Bu cevap doğru ve çok faydalı. Teşekkür ederim.
katma yazar JcR49, kaynak
Teşekkür ederim. İyi çalışıyor.
katma yazar JcR49, kaynak
Teşekkür ederim ..... Sadece biri olmalı ... Daha dikkatli bakacağımı belirtmeliydim. Yardımı takdir ediyorum.
katma yazar JcR49, kaynak
Evet, her bir user_id yalnızca bir tane var. Her iki tablonun bir user_id sütunu var ve eşleşen girişleri var, ancak kullanıcı başına yalnızca bir user_id var.
katma yazar JcR49, kaynak
Güncellenecek binlerce satır var .......
katma yazar JcR49, kaynak
Teşekkür ederim. Ben denedim diğer sorgular gibi, bu 'tek satırlık sorgu birçok satırları döner' döner .. Hiçbir şey eklemek/güncellemek olmaz.
katma yazar JcR49, kaynak
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
katma

Yinelenen user_id'leri oluşturmaktan memnun değilseniz, kayıt zaten t1'de (user_id eşleşmeleri) mevcutsa, bu bir eklenti değildir.

Güncelleme isteyebilir misin?

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

Umarım yardımcı olur...

5
katma
İlişki bire bir değilse, ORA-01427 hatası alırsınız. Yani, equijoin ifadeniz, bir tablodaki bir rekoru başarılı bir şekilde iki tablodaki bir kayıtla eşleştiremez.
katma yazar Nathan, kaynak
ORA-01427: tek sıralı alt sorgu birden fazla satır döndürür
katma yazar JcR49, kaynak
Aynı oraya geri dönmeye devam ediyorum 01427 tek sıralı sorgu birden fazla satır döndürüyor.
katma yazar JcR49, kaynak

"Eşleşmediği zaman" her zaman kullanabilir ve dışarıda bırakabilirsiniz.

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
katma