2016-04-16 5 views
1

У меня есть некоторые денормализованные данные в двух таблицах. Он денормализован, потому что из таблицы DeposititsAndWithdrawals (второй ниже) я могу получить баланс текущего клиента, но для быстрого доступа я держу его в таблице UserBalance (сначала ниже), поэтому мне не нужно суммировать все его операции со всеми время:Обнаружение несогласованных денормализованных данных только в одном запросе SQL?

 
+----+----------+---------+ 
| 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). Как сделать такой JOIN в одном выражении SQL?

+0

Не лучше предотвратить противоречивость, а не пытаться обнаружить и исправить ее? –

+0

да, но это должно изучить SQL лучше, я думаю, мне нужно предложение GROUPBY, но я не уверен – user1623521

ответ

1

Попробуйте

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 стол и A является UserBalance таблица

Смежные вопросы