簡體   English   中英

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

[英]Bulk updating a table from rows from another table

2桌:

Employees
- EmployeeID
- LeadCount


Leads
- leadID
- employeeID

我想通過計算Leads表中具有相同EmployeeID的潛在客戶數來更新Employees.LeadCount列。

注意:可能有多個具有相同employeeID的潛在客戶,因此我必須執行DISTINCT(SUM(employeeID))

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

您正在為數據同步問題做好准備。 在插入,更新或刪除Leads表中的行時,您需要不斷更新Employees.LeadCount列。

最好的解決方案是根本不存儲LeadCount列,而是在需要值時使用SQL聚合查詢重新計算潛在客戶數。 這樣它總是正確的。

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

另一種解決方案是在Leads表上為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;

連接的工作方式與更新(和刪除)相同,就像它們對選擇一樣(編輯:在一些流行的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 EmployeeId)毫無意義 - 你只需要一個COUNT(*)。

  • MS SQL Server支持UPDATE ... FROMDELETE ... FROM語法, MySql也支持 ,但SQL-92標准不支持。 SQL-92會讓你使用行表達式。 我知道DB2支持這種語法,但不確定其他任何語法。 坦率地說,我發現SQL-92版本令人困惑 - 但標准和理論方面的人會爭辯說,FROM語法違反了關系理論,並且可能導致不可預測的結果,不精確的JOIN子句或切換RDBMS供應商時。
UPDATE Employees SET LeadCount = (
  SELECT Distinct(SUM(employeeID)) FROM Leads WHERE Leads.employeeId = Employees.employeeId
)

從上面進行鋼化並刪除從屬子查詢。

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

編輯它是“group By”而不是“distinct”:b(感謝Mark Brackett)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM