У меня есть SQL-запрос, который я сейчас решаю, выполнив два запроса. Мне интересно, есть ли способ сделать это в одном запросе, который сделает его более эффективным.
Рассмотрим две таблицы:
Таблица Transaction_Entries и транзакции, каждая из которых определена ниже:
Transactions
- id
- reference_number (varchar)
Transaction_Entries
- id
- account_id
- transaction_id (references Transactions table)
Примечания. На каждую транзакцию приходится несколько записей. Некоторые транзакции связаны и будут иметь одинаковую строку reference_number.
Чтобы получить все записи транзакции для учетной записи X, я бы набрал
SELECT E.*, T.reference_number, sum(debit_value) total
FROM Transaction_Entries E
JOIN Transactions T ON (E.transaction_id=T.id)
where E.account_id = X
Следующая часть сложная. Я хочу найти все связанные транзакции, независимо от идентификатора аккаунта. Сначала я делаю список всех уникальных ссылочных номеров, которые я нашел в предыдущем наборе результатов. Затем для каждой я могу запросить все транзакции, которые имеют этот ссылочный номер. Предположим, что я храню все строки из предыдущего запроса в PreviousResultSet
UniqueReferenceNumbers = GetUniqueReferenceNumbers(PreviousResultSet) // in Java
foreach R in UniqueReferenceNumbers // in Java
SELECT *, sum(debit_value) total
FROM Transaction_Entries
where transaction_id IN (SELECT *
FROM Transactions
WHERE reference_number=R)
AND account_id = X
GROUP BY another_field
Какие-нибудь предложения, как я могу поместить это в один эффективный запрос?
ПРИМЕЧАНИЕ. Я отредактировал исходный вопрос. Новым дополнением является тот факт, что когда я делаю второй запрос, я ищу только записи транзакций, которые соответствуют reference_number И имеют тот же идентификатор учетной записи. Кроме того, я пытаюсь сгруппировать по другому полю и суммировать значения debit_values в соответствии с этой группировкой.
При попытке использовать решение, предоставленное @Gratzy, я обнаружил, что возвращаются повторяющиеся строки, и поэтому сумма (debit_value) всегда вдвое больше, чем должна быть. Я думаю, это потому, что там есть другие Transaction_Entries, которые не соответствуют account_id, но соответствуют критериям объединения.