2008-09-25 13 views
8

2 टेबल:थोक एक और मेज से पंक्तियों से एक टेबल को अद्यतन करने

Employees 
- EmployeeID 
- LeadCount 


Leads 
- leadID 
- employeeID 

मैं Leads तालिका है एक ही EmployeeID में सुराग की # की गणना के द्वारा Employees.LeadCount स्तंभ अपडेट करना चाहते हैं।

नोट: एक ही कर्मचारी आईडी के साथ 1 से अधिक लीड हो सकती है, इसलिए मुझे DISTINCT(SUM(employeeID)) करना है।

उत्तर

1
UPDATE Employees SET LeadCount = (
    SELECT Distinct(SUM(employeeID)) FROM Leads WHERE Leads.employeeId = Employees.employeeId 
) 
+0

राशि (EmployeeID) कोई मतलब नहीं है, और एक ही मूल्य के आसपास अलग हमेशा समान मान प्रदान करेंगे, तो यह बेमानी है। –

+0

आईआईआरसी जो वास्तव में धीमा होगा (MySQL मैंने जो भी उपयोग किया है) – BCS

12
UPDATE 
    Employees E 
SET 
    E.LeadCount = (
     SELECT COUNT(L.EmployeeID) 
     FROM Leads L 
     WHERE L.EmployeeID = E.EmployeeID 
    ) 
0

ऊपर से steeling और आश्रित सबक्वेरी को हटाने।

// create tmp -> TBL (EmpID, count) 

insert into TBL 
    SELECT employeeID COUNT(employeeID) Di 
    FROM Leads WHERE Leads.employeeId = Employees.employeeId GROUP BY EmployeeId 
UPDATE Employees SET LeadCount = (
    SELECT count FROM TBL WHERE TBL.EmpID = Employees.employeeId 
) 

// drop TBL 

संपादित यह "समूह द्वारा" नहीं "अलग": ख (धन्यवाद मार्क ब्रैकेट)

3

में शामिल अद्यतन के लिए एक ही काम करते हैं (और हटाता है) की तरह ही वे चयन (संपादन के लिए कार्य करें: में कुछ लोकप्रिय आरडीबीएमएस ', कम से कम *):

UPDATE Employees SET 
    LeadCount = Leads.LeadCount 
FROM Employee 
JOIN (
    SELECT EmployeeId, COUNT(*) as LeadCount 
    FROM Leads 
    GROUP BY EmployeeId 
) as Leads ON 
    Employee.EmployeeId = Leads.EmployeeId 

योग (DISTINCT EmployeeID) कोई मतलब नहीं है - तुम सिर्फ एक COUNT (*) की आवश्यकता है। MySql करता है

  • एमएस एसक्यूएल सर्वर, UPDATE...FROM, और DELETE...FROM वाक्य रचना का समर्थन करता है, लेकिन SQL-92 मानक नहीं करता है। एसक्यूएल-9 2 आप एक पंक्ति अभिव्यक्ति का उपयोग करेंगे। मुझे पता है कि DB2 इस वाक्यविन्यास का समर्थन करता है, लेकिन किसी अन्य के बारे में सुनिश्चित नहीं है। स्पष्ट रूप से, मुझे एसक्यूएल-9 2 संस्करण उलझन में मिल रहा है - लेकिन मानक और सिद्धांत जीतेक्स का तर्क है कि सिंटैक्स से रिलेशनल सिद्धांत का उल्लंघन होता है और अपर्याप्त जॉइन क्लॉज या आरडीबीएमएस विक्रेताओं को स्विच करते समय अप्रत्याशित परिणाम हो सकता है।
+0

क्या आपके पास कोई लिंक है? मैं और जानना चाहता हूं। – BCS

+0

किसी कारण से अद्यतन क्वेरी अधिक जटिल है, उम्मीद है कि अब मैं उनके बारे में सोच सकता हूं! –

+0

अद्यतन में शामिल हो जाता है और हटाएं मानक एसक्यूएल नहीं हैं लेकिन कुछ कार्यान्वयन उन्हें एक एक्सटेंशन के रूप में समर्थन देते हैं। आरडीबीएमएस का कौन सा ब्रांड उपरोक्त वाक्यविन्यास का समर्थन करता है? –

8

आप डेटा सिंक्रनाइज़ेशन समस्या के लिए स्वयं को सेट अप कर रहे हैं। चूंकि लीड्स टेबल में पंक्तियां डाली जाती हैं, अपडेट की जाती हैं या हटा दी जाती हैं, आपको कर्मचारियों को अपडेट करने की आवश्यकता होती है। LeadCount कॉलम लगातार।

सबसे अच्छा समाधान लीडकाउंट कॉलम को स्टोर नहीं करना होगा, लेकिन एसक्यूएल समेकित क्वेरी के साथ लीड की गिनती को पुन: गणना करें क्योंकि आपको मूल्य की आवश्यकता है। इस तरह यह हमेशा सही होगा।

SELECT employeeID, COUNT(leadId) AS LeadCount 
FROM Leads 
GROUP BY employeeID; 

अन्य समाधान सम्मिलित करें, अद्यतन के लिए नेतृत्व की मेज पर चलाता बनाने के लिए, और DELETE, ताकि आप Employees.LeadCount स्तंभ वर्तमान हर समय रहते हैं। उदाहरण के लिए, का उपयोग कर MySQL ट्रिगर वाक्य रचना:

CREATE TRIGGER leadIns AFTER INSERT ON Leads 
FOR EACH ROW BEGIN 
    UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID; 
END 

CREATE TRIGGER leadIns AFTER UPDATE ON Leads 
FOR EACH ROW BEGIN 
    UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID; 
    UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID; 
END 

CREATE TRIGGER leadIns AFTER DELETE ON Leads 
FOR EACH ROW BEGIN 
    UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID; 
END 

एक अन्य विकल्प है, अगर आप MySQL का उपयोग कर रहे, बहु तालिका अद्यतन सिंटैक्स का उपयोग करने के लिए है। यह एसक्यूएल के लिए एक MySQL एक्सटेंशन है, यह आरडीबीएमएस के अन्य ब्रांडों के लिए पोर्टेबल नहीं है। सबसे पहले, सभी पंक्तियों में लीडकाउंट को शून्य पर रीसेट करें, फिर लीड्स टेबल में शामिल हों और शामिल होने वाली प्रत्येक पंक्ति में लीडकाउंट बढ़ाएं।

UPDATE Employees SET LeadCount = 0; 
UPDATE Employees AS e JOIN Leads AS l USING (employeeID) 
    SET e.LeadCount = e.LeadCount+1; 
+0

यदि सटीक मान की आवश्यकता नहीं है तो किसी भी तरीके से शेड्यूल किए गए कार्य के रूप में चलाने पर शायद पूछा जा सकता है कि क्या किया जा सकता है। लीडकाउंट को स्टोर न करने के लिए – BCS

+0

+ 1, लेकिन ट्रिगर के लिए -1। मुझे लगता है कि उन्हें वास्तव में अलग जवाब होना चाहिए। –

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