基本的に、tdebits
間の外積を計算しています。 およびtcredits
つまり、tdebits
の各行に対して tcredits
のすべての行を繰り返し処理しています 。 accounts
に参加する理由もありません (to_account_id
を除く およびfrom_account_id
外部キーではありません)。
トランザクションを1回パスオーバーするだけで、金額がクレジットかデビットかを知る必要があります。
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
アカウントが自分自身に転送できる場合は、t.to_account_id <> t.from_account_id
を追加します 。