基本的に、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を追加します 。