Oracle SQL - EKSİ işlecini kullanarak sütun verilerini güncelle

0

Soru

Bu sql sorgum var

(select x.a, x.b, x.c, x.d
from tableX x
where x.a IS NOT NULL
minus 
select y.a, y.b, y.c, y.d
from tableY y);

Yukarıdaki sorgu bana Tabley'den farklı olan tüm tableX verilerini döndürür. Birden çok tuple döndürülür

Kanıt:

Yukarıdaki sorguyu çalıştırdığımda bu sonucu alıyorum:

a b c
1 43 65
2 66 333

Tablodan veri seçtiğimde şunu alıyorum:

a b c
1 54 65
2 88 567

tableY verileri doğru veridir, bu nedenle ilk sorgudan(EKSİ yan tümceli olan) döndürülen tüm tuple'ları Tabley'den gelen verilerle güncellemek istiyorum.

Update yan tümcesinden sonra, tablex'ten veri seçtiğimde beklenen sonuç şöyle olmalıdır::

a b c
1 54 65
2 88 567

Bu GÜNCELLEŞTİRME yan tümcesini yapmanın en etkili yolu nedir?

oracle plsql sql
2021-11-23 19:18:31
2

En iyi cevabı

1

Oracle'da BİRLEŞTİRME sözdizimini GÜNCELLEME sözdiziminden çok daha kullanışlı buluyorum...

MERGE INTO
  tablex   x
USING
  tabley   y
    ON (y.a = x.a)
WHEN MATCHED THEN UPDATE
  SET
    x.b = y.b,
    x.c = y.c
  WHERE
    LNNVL(x.b = y.b)
    OR
    LNNVL(x.c = y.c)

Düzenleme: gereksiz güncellemelerden kaçınmak için aşağıdaki açıklamayı takiben where yan tümcesi eklendi.

2021-11-23 20:50:15

X.b = y.b ve x.c = y.c olduğu satırlar işleme dahil edilir mi?
jarlh

@jarlh bir where yan tümcesi ekledi WHEN MATCHED bu senaryoyu önlemek için.
MatBailie

bu çözüm sorumu çözdü, teşekkür ederim
jct
0
update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley where tabley.a = tablex.a);

İşlem boyutunu küçültmek için xb <> yb veya xc <><> yc ekleyin:

update tablex
set (b, c) = (select b, c from tabley where tabley.a = tablex.a)
where exists (select 1 from tabley
              where tabley.a = tablex.a
                and (LNNVL(tabley.b = tablex.b) or LNNVL(tabley.c = tablex.c)));
2021-11-23 20:39:46

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................