2016-04-16 1 views
1

Ich habe einige denormalisierte Daten in zwei Tabellen. Es ist denormalized, weil ich aus der DepositsAndWithdrawals-Tabelle (zweite unten) das aktuelle Kundenkonto abrufen kann, aber für den schnellen Zugriff behalte ich es in der UserBalance-Tabelle (erste unten), so dass ich nicht alle seine Operationen summieren muss Zeit:Erkennen von Inkonsistenzen bei denormalisierten Daten in nur einer SQL-Abfrage?

 
+----+----------+---------+ 
| ID | Username | Balance | 
+----+----------+---------+ 
| 1 | Alice | 50  | 
+----+----------+---------+ 
| 2 | Bob  | 20  | 
+----+----------+---------+ 
| 3 | Charles | 30  | 
+----+----------+---------+ 
 
+----+------------+---------+ 
| ID | CustomerID | Amount | 
+----+------------+---------+ 
| 1 | 1   | 50  | 
+----+------------+---------+ 
| 2 | 2   | 80  | 
+----+------------+---------+ 
| 3 | 3   | 10  | 
+----+------------+---------+ 
| 4 | 2   | -60  | 
+----+------------+---------+ 
| 5 | 3   | 20  | 
+----+------------+---------+ 

Dies bringt eine Konsistenzproblem bei dort Rennbedingungen im System vorhanden sind. Um diese zu erkennen, hätte ich gerne eine tägliche DB-Abfrage, die Balance-Inkonsistenzen erkennt (dh wenn SUM(amount) sich von balance unterscheidet). Wie macht man einen solchen JOIN in einer einzigen SQL-Anweisung?

+0

nicht besser ist die Inkonsistenz zu vermeiden, anstatt zu versuchen, sie zu erkennen und zu beheben? –

+0

ja, aber das ist SQL besser zu lernen, ich denke, ich brauche die GROUPBY-Klausel, aber ich bin mir nicht sicher – user1623521

Antwort

1

Versuchen Sie, diese

SELECT A.ID As customerId, A.BALANCE, SUM(B.AMOUNT) AS REAL_BALANCE FROM A 
JOIN B on A.ID = B.customerId 
GROUP BY A.ID, A.BALANCE 
HAVING SUM(B.AMOUNT) <> A.BALANCE 

Wo B Ihre DepositsAndWithdrawals Tisch und A ist UserBalance Tabelle

Verwandte Themen