Employees
- EmployeeID
- LeadCount
Leads
- leadID
- employeeID
我想通过计数Leads
表具有相同EmployeeID
引线#更新Employees.LeadCount
列。
注意:可能有超过1名领导具有相同的employeeID,所以我必须做一个DISTINCT(SUM(employeeID))
。
Employees
- EmployeeID
- LeadCount
Leads
- leadID
- employeeID
我想通过计数Leads
表具有相同EmployeeID
引线#更新Employees.LeadCount
列。
注意:可能有超过1名领导具有相同的employeeID,所以我必须做一个DISTINCT(SUM(employeeID))
。
UPDATE Employees SET LeadCount = (
SELECT Distinct(SUM(employeeID)) FROM Leads WHERE Leads.employeeId = Employees.employeeId
)
UPDATE
Employees E
SET
E.LeadCount = (
SELECT COUNT(L.EmployeeID)
FROM Leads L
WHERE L.EmployeeID = E.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
编辑它的“分组依据”不“不同”:B(感谢马克·布拉克特)
连接的工作原理相同的更新(和删除),就像他们的选择(编辑做的:在一些流行的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(*)。
你有链接吗?我想了解更多。 – BCS 2008-09-26 00:31:03
您正在设置自己的数据同步问题。随着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;
sum(employeeid)没有任何意义,并且围绕单个值的不同将始终返回相同的值,因此它是多余的。 – 2008-09-26 00:08:36
IIRC会很慢(MySQL是我用过的) – BCS 2008-09-26 00:13:35