8

2つのテーブル:

Employees
- EmployeeID
- LeadCount


Leads
- leadID
- employeeID

同じを持っているテーブルEmployees.LeadCount内のリードの数を数えて列を更新したいと思います。LeadsEmployeeID

注:同じemployeeIDを持つリードが複数ある可能性があるため、を実行する必要がありDISTINCT(SUM(employeeID))ます。

4

5 に答える 5

12
UPDATE
    Employees E
SET
    E.LeadCount = (
        SELECT COUNT(L.EmployeeID)
        FROM Leads L
        WHERE L.EmployeeID = E.EmployeeID
    )
于 2008-09-26T00:02:12.653 に答える
10

データ同期の問題に備えています。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;
于 2008-09-26T00:26:29.630 に答える
4

結合は、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(*)だけです。

  • MS SQL Serverは、 MySqlと同様にUPDATE...FROMおよびDELETE...FROM構文をサポートしていますが、SQL-92標準はサポートしていません。SQL-92では、行式を使用する必要があります。DB2がこの構文をサポートしていることは知っていますが、他の構文についてはわかりません。率直に言って、SQL-92バージョンは紛らわしいと思いますが、標準と理論の専門家は、FROM構文がリレーショナル理論に違反しており、不正確なJOIN句を使用したり、RDBMSベンダーを切り替えたりすると予測できない結果につながる可能性があると主張します。
于 2008-09-26T00:24:13.660 に答える
1
UPDATE Employees SET LeadCount = (
  SELECT Distinct(SUM(employeeID)) FROM Leads WHERE Leads.employeeId = Employees.employeeId
)
于 2008-09-25T23:59:37.980 に答える
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 (マークブラケットに感謝)

于 2008-09-26T00:08:54.133 に答える