Você está basicamente calculando o produto cruzado entre um
tdebits
e tcredits
, ou seja, para cada linha em tdebits
você está iterando em todas as linhas em tcredits
. Também não há motivo para participar de accounts
(a menos que to_account_id
e from_account_id
não são chaves estrangeiras). Você só precisa fazer uma transação de repasse e só precisa saber se o valor é crédito ou débito.
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
Se uma conta puder ser transferida para si mesma, adicione um
t.to_account_id <> t.from_account_id
.