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

cam*_*mbo 2 sql performance join

我有一个SQL查询,我正在通过做两个查询来解决.我想知道是否有一种方法可以在单个查询中进行,使其更有效.

考虑两个表:

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

Transactions
- id
- reference_number  (varchar)


Transaction_Entries
- id
- account_id
- transaction_id (references Transactions table)
Run Code Online (Sandbox Code Playgroud)

注意:每个事务有多个事务条目.某些事务是相关的,并且将具有相同的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
Run Code Online (Sandbox Code Playgroud)

下一部分是困难的部分.我想查找所有相关的交易,无论帐户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
Run Code Online (Sandbox Code Playgroud)

有什么建议我可以把它放到一个有效的查询?

注意:我编辑了原始问题.新添加的事实是,当我执行第二个查询时,我只查找与reference_number匹配且具有相同帐户ID的事务条目.此外,我正在尝试按another_field进行分组,并根据该分组对debit_values求和.

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

Gra*_*tzy 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
Run Code Online (Sandbox Code Playgroud)

如果该帐户具有相同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 
Run Code Online (Sandbox Code Playgroud)

  • 用`SELECT DISTINCT E2.*`替换你的'SELECT`,你得到了确切的答案. (3认同)