仅在一个 SQL 查询中检测非规范化数据不一致?

Detect denormalized-data inconsistencies in just one SQL query?

我在两个 table 中有一些非规范化数据。它是非规范化的,因为从 DepositsAndWithdrawals table(下面的第二个)我可以获得当前客户的余额,但是为了快速访问,我将它保存在 UserBalance table(下面的第一个)中所以我不需要总结一下他一直以来的所有操作:

+----+----------+---------+
| 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      |
+----+------------+---------+

如果系统中存在竞争条件,这会带来一致性问题。因此,为了检测这些,我希望每天进行一次数据库查询来检测余额不一致(即,当 SUM(amount)balance 不同时)。如何在单个 SQL 语句中执行这样的 JOIN?

试试这个

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

其中 B 是您的 DepositsAndWithdrawals table 而 AUserBalance table