2012-07-27 16 views
6

के बीच सबक्वायरी के आधार पर ओरेकल एसक्यूएल अपडेट मैं वर्तमान में एक क्वेरी-सक्षम तालिका को अद्यतित रखने के लिए अद्यतन विवरण लिख रहा हूं। स्कीमा दोनों तालिकाओं के बीच समान है और सामग्री महत्वपूर्ण नहीं हैं: नोट केदो टेबल

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

दो बातें कर रहा है 1) कोई यह है कि जहां खंड पर:

STAGING 

ID 
NAME 
COUNT  

PRODUCTION 

ID 
NAME 
COUNT 

मेरे अद्यतन बयान इस प्रकार है लग रहा है मेरे अपडेट का अंत (यह समस्या हो सकती है) और 2) अद्यतन होने के बाद सभी रिकॉर्ड समान मान हैं। क्या मैं यह मतलब है निम्नलिखित:

BEFORE UPDATE: 

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

AFTER UPDATE 

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

मेरा प्रश्न है कि कैसे मैं इतना है कि तालिका ठीक से एक सही एसक्यूएल अद्यतन के रूप में मंचन से 'नई' डेटा को दर्शाता है यह ठीक करते हैं?

अद्यतन

तो मेरी मचान डेटा संयोग दर्पण सकता है क्या PRODUCTION में और चर्चा की खातिर यह होगा के लिए है:

STAGING DATA TO MERGE: 

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

अद्यतन दूसरा

क्वेरी कि मैं यह दौड़ना चाहता हूं:

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

where production.name = staging.name; 

हालांकि यह "staging.name"

+0

क्या आप ** नाम ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ##* – hmmftg

+0

आप इस अद्यतन के बजाय नए मान डालने के लिए ट्रिगर्स का उपयोग क्यों नहीं करते? यह अद्यतन वास्तव में क्या करता है? – hmmftg

+0

सहमत हैं, टेबल को सिंक करते समय, ट्रिगर वास्तविक समय को वास्तविक समय में रखने में वास्तव में उपयोगी हो सकते हैं। तालिका त्रुटियों को म्यूट करने के लिए बस देखें, और इसे बाद में या अद्यतन के रूप में करना सुनिश्चित करें। – Hermit

उत्तर

26

वहाँ क्या आप

एक कोशिश कर रहे हैं करने के लिए दो तरीके हैं एक Multi-column Correlated Update

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

DEMO

आप उपयोग कर सकते हैं merge

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

+0

मुझे बहु-कॉलम सहसंबंधित करने का प्रयास करें। मुझे धीमा होने के कारण विलय से दूर जाना पड़ा (10 मिलियन से अधिक रिकॉर्ड) – Woot4Moo

0

आपने ध्यान दिया होगा पर अमान्य पहचानकर्ता मुद्दों में परिणाम है, तो आप अपने अद्यतन बयान तो यह अपने पूरे तालिका अपडेट कर रहा है करने के लिए कोई चयनात्मकता की है। यदि आप विशिष्ट पंक्तियों को अपडेट करना चाहते हैं (यानी आईडी मिलान करते हैं) तो आप शायद समन्वित सबक्वायरी करना चाहते हैं।

हालांकि, चूंकि आप ओरेकल का उपयोग कर रहे हैं, इसलिए आपकी क्वेरी तालिका के लिए भौतिक दृश्य बनाना आसान हो सकता है और ओरेकल के लेनदेन तंत्र को विवरणों को संभालने दें। एमवी सैमसंगिक्स से पूछताछ के लिए बिल्कुल एक टेबल की तरह काम करते हैं, सेट अप करने में काफी आसान हैं, और आपको रीफ्रेश अंतराल निर्दिष्ट करने की अनुमति देते हैं।

1

स्टेजिंग के डेटासेट के उदाहरणों के बिना यह अंधेरे में एक शॉट है, लेकिन क्या आपने ऐसा कुछ करने की कोशिश की है?

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

यह दोनों टेबलों पर आईडी कॉलम मैचों को मानने में काम करेगा।

+0

तो क्या होगा यदि केवल एकमात्र चीजें जिन्हें मैं मिलान करना चाहता हूं वे मेरे सबक्वायरीज़ में क्लोज़ हैं? आईई सेट ब्लाह जहां p.name = s.name और p.count = s.count? – Woot4Moo

+0

यदि आपने ऐसा किया है, तो आप एक = से बी सेट करेंगे जहां एक = है बी (यानी यह कुछ भी नहीं करेगा)। – Hermit

+0

ओप्स मेरे भाग पर तर्क विफल रहा :) – Woot4Moo

0

इसे आज़माएं ..
अद्यतन उत्पादन एक
सेट (नाम, गिनती) = (
चयन नाम, से मचान ख
गिनती
कहां a.ID = b.ID)
कहां मौजूद है (का चयन करें 1
से मचान ख
जहां a.ID = b.ID
);

संबंधित मुद्दे