web-gelistirme-sc.com

İki tablo arasındaki alt sorguyu temel alan Oracle SQL güncellemesi

Şu anda sorgulanabilir bir tabloyu sürekli güncel tutmak için güncelleme bildirimleri yazıyorum. Şema, her iki tablo arasında aynıdır ve içeriği önemli değildir: 

STAGING  

ID  
NAME  
COUNT    

PRODUCTION  

ID  
NAME  
COUNT

Güncelleme bildirim aşağıdaki gibi görünüyor: 

update PRODUCTION  
set name = (select stage.name from staging stage where stage.name=name  and rownum <2),  
    count =   (select stage.countfrom staging stage where stage.count=count  and rownum <2);

Unutulmaması gereken iki şey 1) Güncellememin sonunda (bu sorun olabilir) ve 2) güncellemenin sonunda tüm kayıtların aynı değerlere sahip olduğu durumlarda hiçbir yan tümce olmadığıdır. Bununla demek istediğim şudur: 

BEFORE UPDATE:  

1,"JOHN", 12;  
2,"STEVE",15;  
3,"BETTY",2;  

AFTER UPDATE  

    1,"JOHN", 12;  
    2,"JOHN",12;  
    3,"JOHN",12;

Sorum şu, bunu doğru bir şekilde, masanın doğru bir SQL güncellemesi olarak "yeni" verileri sahnelemeyi yansıtması için nasıl düzeltirim?

G&UUML;NCELLEME 

Böylece evreleme verilerim PRODUCTION içinde ne olduğunu rastgele yansıtabilir ve tartışma uğruna şöyle olacaktır: 

STAGING DATA TO MERGE:  

    1,"JOHN", 12;  
    2,"STEVE",15;  
    3,"BETTY",2; 

ikinciyi güncelle  

Çalıştırmak istediğim sorgu şudur: 

update PRODUCTION
set production.name = staging.name,  
    production.count = staging.count

where production.name = staging.name;

Ancak bu "staging.name" de geçersiz tanımlayıcı sorunlarına neden olur

9
Woot4Moo

Ne yapıyorsan onu yapmanın iki yolu var.

Biri bir Çok sütunlu İlişkili Güncelleme

UPDATE PRODUCTION a
SET (name, count) = (
  SELECT name, count
  FROM STAGING b
  WHERE a.ID = b.ID);

DEMO

birleştirme kullanabilirsiniz

MERGE INTO PRODUCTION a
USING ( select id, name, count 
          from STAGING ) b
ON ( a.id = b.id )
WHEN MATCHED THEN 
UPDATE SET  a.name = b.name,
            a.count = b.count

DEMO

32
Conrad Frix

Veri kümesinin örnekleri olmadan bu karanlıkta bir çekimdir, ancak böyle bir şey denediniz mi?

update PRODUCTION p,
       staging s
set p.name = s.name  
    p.count = s.count
where p.id = s.id

Bu, id sütununun her iki tabloda da eşleşeceğini varsayarak çalışır.

1
Hermit

Dene .. 

UPDATE PRODUCTION a
SET (name, count) = (
SELECT name, count
        FROM STAGING b
        WHERE a.ID = b.ID)
WHERE EXISTS (SELECT 1
    FROM STAGING b
    WHERE a.ID=b.ID
 );

Fark ettiğiniz gibi, güncelleme ifadenizde seçiciliğiniz yoktur, bu nedenle tüm tablonuzu günceller. Belirli satırları (yani kimlikleri eşleştiği yerleri) güncellemek istiyorsanız, muhtemelen koordineli bir alt sorgu yapmak istersiniz.

Ancak, Oracle kullandığınız için, sorgu tablonuz için materyalize bir görünüm oluşturmak ve Oracle'ın işlem mekanizmasının ayrıntıları ele almasına izin vermek daha kolay olabilir. MV'ler, semantikleri sorgulamak için tam olarak bir tablo gibi çalışır, ayarlarının yapılması oldukça kolaydır ve yenileme aralığını belirlemenizi sağlar.

0
khoxsey