2008-09-25 84 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;