将两部分SQL查询合并为一个查询

问题描述:

我有一个SQL查询,目前我正在通过执行两个查询来解决这个问题。我想知道是否有一种方法可以在单个查询中实现,从而提高效率。将两部分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 

接下来的部分是最困难的部分。我想查找所有相关交易,而不管帐户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提供的解决方案时发现的是,重复的行正在返回,因此总和(debit_value)总是它应该是的值的两倍。我认为这是因为其中有其他的Transaction_Entries与account_id不匹配,但与匹配条件相匹配。

+2

数据库和版本? – 2010-06-07 20:48:16

尝试

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 

如果该帐户拥有众多transaction_Entries为同一REFERENCE_NUMBER你可能会得到重复

编辑添加@面包车的建议,我相信他是正确的,谢谢。

编辑 这是编辑,以限制对相同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 
+0

我认为这将限制它只有共享相同的account_id条目。他提到它应该包括具有相同参考编号的所有交易,而不管帐户编号如何。 – 2010-06-07 20:55:45

+0

在我用7个Transaction_Entries创建的测试表上,您的查询将返回一个包含8行的结果集。这对我来说似乎很令人惊讶。是否应该返回比现有行更多的行,或者在查询中是否有错误?如果需要,我可以发布测试表。 – 2010-06-07 20:56:09

+0

@Eric Petroelje不,我不这么认为,但它可能会导致它重复行 – Gratzy 2010-06-07 20:56:49

,我认为这会工作:

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

谢谢,这个答案也适用于我。 – cambo 2010-06-09 16:44:58

为什么不:

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