2012-10-12 23 views
5

मैं एक अलग तालिका में किसी अन्य फ़ील्ड से किसी तालिका में फ़ील्ड को अपडेट करने का प्रयास कर रहा हूं।एक अलग तालिका में किसी अन्य फ़ील्ड से किसी तालिका में 1 फ़ील्ड अपडेट करें (ओएस 400, 1 से 1 रिश्ते नहीं)

तालिका अपडेट होने पर कई रिकॉर्ड होंगे जिन्हें अन्य तालिका में 1 मैच से अपडेट करने की आवश्यकता होगी।

उदाहरण, मेरे पास 1 मिलियन पंक्ति बिक्री इतिहास फ़ाइल है। उन लाखों रिकॉर्डों में लगभग 40,000 विभिन्न स्कू कोड हैं, प्रत्येक पंक्ति में दिनांक और समय टिकट होता है। प्रत्येक स्कू में वहां कई रिकॉर्ड होंगे।

मैंने MATCOST (सामग्री लागत) नामक एक नया क्षेत्र जोड़ा।

मेरे पास एसकेयू और MATCOST युक्त एक दूसरी तालिका है।

तो मैं टेबल 2 में संबंधित एसकेयू के MATCOST के साथ तालिका 1 में प्रत्येक पंक्ति को मुद्रित करना चाहता हूं। मैं इसे प्राप्त करने के लिए प्रतीत नहीं कर सकता जब यह 1 से 1 रिश्ते नहीं है।

यह मैं क्या करने की कोशिश की है:

update 
    aulsprx3/cogtest2 
set 
    matcost = (select Matcost from queryfiles/coskitscog where 
    aulsprx3/cogtest2.item99 = queryfiles/coskitscog.ITEM) 
where 
    aulsprx3/cogtest2.item99=queryfiles/coskitscog.ITEM 

लेकिन उस एसक्यूएल त्रुटि में परिणाम है: कॉलम क्वालीफायर या तालिका COSKITSCOG अपरिभाषित और queryfiles करने के लिए पिछले संदर्भ में क्ष पर प्रकाश डाला/coskitscog.Item

कोई विचार ?

Kindest का संबंध

एडम

अपडेट: यह क्या मेरी टेबल सिद्धांत रूप में की तरह लग रही है। 1 तालिका में बिक्री डेटा होता है, दूसरे में बेची गई वस्तुओं के लिए MATCOSTS होता है। मुझे कोस्किटको तालिका से डेटा के साथ बिक्री डेटा तालिका (COGTEST2) को अपडेट करने की आवश्यकता है। मैं एक coalesce कथन का उपयोग नहीं कर सकता क्योंकि यह 1 से 1 रिश्ते नहीं है, अधिकांश चयन कार्यों का उपयोग मैं कई चयनों की त्रुटि में परिणाम का उपयोग करता हूं। एकमात्र मिलान क्षेत्र आइटम = आइटम 99

मुझे एकाधिक मिलान करने का कोई तरीका नहीं मिल रहा है। उदाहरण में हमें 3 एसक्यूएल कथन का उपयोग करना होगा और केवल आइटम कोड निर्दिष्ट करना होगा। लेकिन लाइव में मेरे पास लगभग 40,000 आइटम कोड हैं और अपडेट करने के लिए दस लाख से अधिक बिक्री डेटा रिकॉर्ड हैं। यदि एसक्यूएल ऐसा नहीं करेगा, तो मुझे लगता है कि मुझे इसे आरपीजी प्रोग्राम में लिखने की कोशिश करनी होगी, लेकिन इस पल के लिए मेरे रास्ते से परे।

आपकी सहायता के लिए धन्यवाद।

Tables Example

+0

कोई और कोई सहायता प्रदान करता है? –

उत्तर

2

correlation names साथ कॉलम योग्य।

UPDATE AULSPRX3/COGTEST2 A 
    SET A.matcost = (SELECT matcost 
         FROM QUERYFILES/COSKITSCOG B 
         WHERE A.item99 = B.item) 
    WHERE EXISTS(SELECT * 
        FROM QUERYFILES/COSKITSCOG C 
        WHERE A.item99 = C.item) 
+0

आप 'एमैटकोस्ट <> सीमैटकोस्ट' के लिए अंतिम उप-चयन में एक परीक्षण जोड़ना चाहते हैं, क्योंकि रिकॉर्ड अपडेट करने में थोड़ा सा बिंदु है जहां मूल्य नहीं बदलेगा। – WarrenT

+0

अपने उत्तर के लिए धन्यवाद @JamesA लेकिन मैं मिलता है: चयन के परिणाम एक से अधिक पंक्तियां जब मैं चलने वाले :( –

+0

जहां यहां खंड (से QUERYFILES/COSKITSCOG बी कहां A.item99 = B.item matcost का चयन करें) इसके परिणामस्वरूप एकाधिक ए = बी हो सकता है क्योंकि ए में आइटम की 1000 पुनरावृत्ति हो सकती है क्योंकि यह तिथि से प्रेरित होती है। आइटम को हर दिन 5 साल तक बेचा जा सकता है। यह COGTEST2 फ़ाइल है। बिक्री इतिहास की विशाल मात्रा। –

0

UPDATE से, मेरा सुझाव चाहते हैं:

update 
    aulsprx3/cogtest2 
set 
    (matcost) = (select Matcost from queryfiles/coskitscog where 
       aulsprx3/cogtest2.item99 = queryfiles/coskitscog.ITEM) 
where 
    aulsprx3/cogtest2.item99=queryfiles/coskitscog.ITEM 

नोट matcost आसपास ब्रेसिज़।

+0

हाय @ ओलाफ डायत्शे इसे प्रारंभिक पसंद नहीं है कॉमा। मुझे बस मिलता है: टोकन, मान्य नहीं था। वैध टोकन: SET। –

+0

इसके लिए मुझे कॉलम क्वालीफायर या टेबल कोस्किटस्को को अनिर्धारित किया गया है और यह coskitscog.item के अंतिम संदर्भ को हाइलाइट करता है –

5

ठीक है यह अंतिम SQL कथन है जो काम करता है।

UPDATE atst2f2/SAP20 ct         
     SET VAL520 = (SELECT cs.MATCOST      
        FROM queryfiles/coskitscog cs   
        WHERE cs.ITEM = ct.pnum20), 
      VAL620 = (SELECT cs.LABCOST      
        FROM queryfiles/coskitscog cs   
        WHERE cs.ITEM = ct.pnum20), 
      VAL720 = (SELECT cs.OVRCOST      
        FROM queryfiles/coskitscog cs   
        WHERE cs.ITEM = ct.pnum20),    
     WHERE ct.pnum20 IN (SELECT cs.ITEM      
         FROM queryfiles/coskitscog cs) 
2

एक ही बात को और अधिक कुशल, हाँ होना चाहिए करने के लिए यह अधिक कॉम्पैक्ट रास्ता (वहाँ अद्यतन करने के लिए वास्तव में 3 मूल्यों थे)?

UPDATE atst2f2/SAP20 ct         
    SET (VAL520, VAL620, VAL720) = 
     (SELECT cs.MATCOST, cs.LABCOST, cs.OVRCOST      
       FROM queryfiles/coskitscog cs   
       WHERE cs.ITEM = ct.pnum20)    
    WHERE ct.pnum20 IN (SELECT cs.ITEM      
        FROM queryfiles/coskitscog cs)