两个表格:
Employees
- EmployeeID
- LeadCount
Leads
- leadID
- employeeID
我想通过计算
Leads
表中与EmployeeID
相同的潜在客户数量,来更新Employees.LeadCount
列。注意:可能存在多个具有相同
employeeID
的潜在客户,因此必须进行DISTINCT(SUM(employeeID))
操作。两个表格:
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,另一个选项是使用多表更新语法。这是MySQL对SQL的扩展,不适用于其他品牌的关系型数据库管理系统。首先将所有行中的LeadCount重置为零,然后与Leads表进行连接,并在由连接产生的每一行中递增LeadCount。
UPDATE Employees SET LeadCount = 0;
UPDATE Employees AS e JOIN Leads AS l USING (employeeID)
SET e.LeadCount = e.LeadCount+1;
对于更新(和删除)操作,连接的工作方式与选择操作相同(至少在某些流行的关系型数据库管理系统中):
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(*)。
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)