Объединение двухкомпонентного SQL-запроса в один запрос - PullRequest
2 голосов
/ 08 июня 2010

У меня есть 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, но соответствуют критериям объединения.

Ответы [ 3 ]

7 голосов
/ 08 июня 2010

Попробуйте

SELECT distinct E2.*, T.reference_number 
FROM Transaction_Entries E 
INNER JOIN Transactions T ON (E.transaction_id=T.id) 
INNER JOIN Transactions T2 on T.reference_number = T2.reference_number
INNER JOIN Transaction_Entries E2 on T2.id = E2.transaction_Id
where E.account_id = X

Если в учетной записи есть несколько записей за один и тот же ссылочный номер транзакции, вы можете получить дубликаты

РЕДАКТИРОВАТЬ Добавлено предложение @ van. Я считаю, что он прав, спасибо.

EDIT Это отредактировано, чтобы ограничить тем же account_id's

SELECT distinct E2.*, T.reference_number  
FROM Transaction_Entries E  
INNER JOIN Transactions T ON (E.transaction_id=T.id)  
INNER JOIN Transactions T2 on T.reference_number = T2.reference_number 
INNER JOIN Transaction_Entries E2 on T2.id = E2.transaction_Id and E2.account_id = E.account_id
where E.account_id = x 
2 голосов
/ 08 июня 2010

Я думаю, что это будет работать:

SELECT * 
FROM Transaction_Entries te
INNER JOIN Transactions t ON t.id = te.transaction_id
INNER JOIN (
  SELECT DISTINCT T.reference_number 
  FROM Transaction_Entries E 
  JOIN Transactions T ON (E.transaction_id=T.id) 
  WHERE E.account_id = X
) refs ON t.reference_number = refs.reference_number
0 голосов
/ 08 июня 2010

почему бы и нет:

select *
from   Transaction_Entries
where  transaction_id In (select   id, 
                          from     transactions 
                          group by reference_number) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...