Zasadniczo obliczasz iloczyn krzyżowy między tdebits
i tcredits
, czyli dla każdego wiersza w tdebits
iterujesz po wszystkich wierszach w tcredits
. Nie ma też powodu, aby dołączać do accounts
(chyba że to_account_id
i from_account_id
nie są kluczami obcymi).
Wystarczy wykonać tylko jedną transakcję pominięcia i wystarczy wiedzieć, czy kwota jest kredytem czy debetem.
SELECT SUM(CASE WHEN t.to_account_id = $1 THEN t.amount ELSE -t.amount END) AS amount
FROM transactions AS t
WHERE (t.to_account_id = $1 OR t.from_account_id = $1)
AND t.succeed = true
Jeśli konto może przenieść się na siebie, dodaj t.to_account_id <> t.from_account_id
.