将两部分SQL查询组合到一个查询中

时间:2010-06-07 20:45:20

标签: sql join performance

我有一个SQL查询,我目前正在通过执行两个查询来解决。我想知道是否有办法在单个查询中执行此操作,以提高效率。

考虑两个表:

Transaction_Entries表和Transactions,每个都定义如下:

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

下一部分是困难的部分。我想查找所有相关的交易,无论帐户ID如何。首先,我列出了我在上一个结果集中找到的所有唯一参考号。然后,对于每一个,我可以查询具有该参考编号的所有交易。假设我保留了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匹配且具有相同帐户ID的事务条目。此外,我正在尝试按another_field进行分组,并根据该分组对debit_values求和。

在尝试使用@Gratzy提供的下面的解决方案时,我发现正在返回重复的行,因此sum(debit_value)总是它应该的值的两倍。我认为这是因为其中有其他Transaction_Entries与account_id不匹配但与匹配条件匹配。

3 个答案:

答案 0 :(得分:7)

尝试

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

如果帐户有相同reference_number的多个transaction_Entries,则可能会出现重复

编辑已添加@ van的建议我相信他是对的,谢谢。

修改 这被编辑为限制在同一个account_id的

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 

答案 1 :(得分:2)

我认为这样可行:

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

答案 2 :(得分:0)

为什么不:

select *
from   Transaction_Entries
where  transaction_id In (select   id, 
                          from     transactions 
                          group by reference_number)