2つのテーブル:
Employees
- EmployeeID
- LeadCount
Leads
- leadID
- employeeID
同じを持っているテーブルEmployees.LeadCount
内のリードの数を数えて列を更新したいと思います。Leads
EmployeeID
注:同じemployeeIDを持つリードが複数ある可能性があるため、を実行する必要がありDISTINCT(SUM(employeeID))
ます。
2つのテーブル:
Employees
- EmployeeID
- LeadCount
Leads
- leadID
- employeeID
同じを持っているテーブルEmployees.LeadCount
内のリードの数を数えて列を更新したいと思います。Leads
EmployeeID
注:同じ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;
もう1つの解決策は、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;
結合は、selectの場合と同じように更新(および削除)でも同じように機能します(編集:いくつかの一般的な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(*)だけです。
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
編集それは「個別」ではなく「グループ化」です:b (マークブラケットに感謝)