仅在一个 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 而 A
是 UserBalance
table
我在两个 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 而 A
是 UserBalance
table