Massenaktualisierung einer Tabelle aus Zeilen einer anderen Tabelle

8

2 Tabellen:

%Vor%

Ich möchte die Spalte Employees.LeadCount aktualisieren, indem ich die Anzahl der Leads in der Tabelle Leads mit demselben EmployeeID zählt.

Hinweis: Es kann mehr als eine Ableitung mit der gleichen Mitarbeiter-ID geben, also muss ich eine DISTINCT(SUM(employeeID)) machen.

    
public static 25.09.2008, 23:56
quelle

5 Antworten

12
%Vor%     
Jonny Buchanan 26.09.2008 00:02
quelle
8

Sie bereiten sich auf ein Datensynchronisierungsproblem vor. Wenn Zeilen in der Leads-Tabelle eingefügt, aktualisiert oder gelöscht werden, müssen Sie die Spalte Employees.LeadCount ständig aktualisieren.

Die beste Lösung wäre, die LeadCount-Spalte nicht zu speichern, sondern die Anzahl der Leads mit einer SQL-Aggregatabfrage neu zu berechnen, wenn Sie den Wert benötigen. So wird es immer stimmen.

%Vor%

Die andere Lösung besteht darin, Trigger für die Tabellen "Leads" für INSERT, UPDATE und DELETE zu erstellen, sodass Sie die Spalte "Employees.LeadCount" immer aktuell halten. Verwenden Sie zum Beispiel die MySQL-Triggersyntax:

%Vor%

Eine weitere Option, wenn Sie MySQL verwenden, ist die Verwendung der UPDATE-Syntax für mehrere Tabellen. Dies ist eine MySQL-Erweiterung für SQL, die nicht auf andere RDBMS-Marken übertragbar ist. Setzen Sie zuerst den LeadCount in allen Zeilen auf Null zurück, führen Sie dann einen Join zur Leads-Tabelle aus und inkrementieren Sie den LeadCount in jeder vom Join erzeugten Zeile.

%Vor%     
Bill Karwin 26.09.2008 00:26
quelle
3

Joins funktionieren genauso für Updates (und Löschvorgänge) wie für selects (Bearbeiten: in einigen populären RDBMS, mindestens *):

%Vor%

Die SUM (DISTINCT EmployeeId) macht keinen Sinn - Sie brauchen nur ein COUNT (*).

  • MS SQL Server unterstützt UPDATE ... FROM und DELETE ... FROM -Syntax, wie auch MySql , aber der SQL-92 Standard nicht. In SQL-92 würden Sie einen Zeilenausdruck verwenden. Ich weiß, dass DB2 unterstützt diese Syntax, ist sich aber anderer nicht sicher. Ehrlich gesagt, finde ich die SQL-92-Version verwirrend - aber Standards und Theorie wonks argumentieren, dass die FROM-Syntax relationale Theorie verletzt und zu unvorhersehbaren Ergebnissen mit ungenauen JOIN-Klauseln oder beim Wechsel von RDBMS-Anbietern führen kann.
Mark Brackett 26.09.2008 00:24
quelle
1
%Vor%     
Jason Cohen 25.09.2008 23:59
quelle
0

Steeling von oben und Entfernen der abhängigen Unterabfrage.

%Vor%

BEARBEITEN Es ist "group By" nicht "distinct": b (danke Mark Brackett)

    
BCS 26.09.2008 00:08
quelle

Tags und Links