2008-09-25 41 views
8

2表:批量從另一個表更新從行的表

Employees 
- EmployeeID 
- LeadCount 


Leads 
- leadID 
- employeeID 

我想通過計數Leads表具有相同EmployeeID引線#更新Employees.LeadCount列。

注意:可能有超過1名領導具有相同的employeeID,所以我必須做一個DISTINCT(SUM(employeeID))

回答

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

sum(employeeid)沒有任何意義,並且圍繞單個值的不同將始終返回相同的值,因此它是多餘的。 – 2008-09-26 00:08:36

+0

IIRC會很慢(MySQL是我用過的) – BCS 2008-09-26 00:13:35

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

從上方鋼化和除去從屬子查詢。

// 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 

編輯它的「分組依據」不「不同」:B(感謝馬克·布拉克特)

3

連接的工作原理相同的更新(和刪除),就像他們的選擇(編輯做的:在一些流行的RDBMS」,至少*):

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 

的SUM(DISTINCT僱員)是沒有意義的 - 你只需要一個COUNT(*)。

  • MS SQL Server支持UPDATE...FROM,和DELETE...FROM語法一樣,MySql,但SQL-92標準沒有。 SQL-92會讓你使用行表達式。我知道DB2支持這種語法,但不確定其他語言。坦率地說,我發現SQL-92版本令人困惑 - 但標準和理論方面的人士會認爲,FROM語法違反了關係理論,並且可能導致無法預測的結果,但不準確的JOIN子句或切換RDBMS供應商。
+0

你有鏈接嗎?我想了解更多。 – BCS 2008-09-26 00:31:03

8

您正在設置自己的數據同步問題。隨着Leads表中的行被插入,更新或刪除,您需要不斷更新Employees.LeadCount列。

最好的解決方案不是存儲LeadCount列,而是根據需要重新計算帶有SQL聚合查詢的銷售線索數。這樣它總是正確的。

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

另一個解決辦法是對信息表的INSERT,UPDATE創建觸發器和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,另一種選擇是使用多表UPDATE語法。這是SQL的MySQL擴展,它不能移植到其他品牌的RDBMS。首先,將所有行中的LeadCount重置爲零,然後對Leads表執行聯接,並在聯接所產生的每行中增加LeadCount。

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