将两部分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不匹配,但与匹配条件相匹配。
尝试
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
我认为这将限制它只有共享相同的account_id条目。他提到它应该包括具有相同参考编号的所有交易,而不管帐户编号如何。 – 2010-06-07 20:55:45
在我用7个Transaction_Entries创建的测试表上,您的查询将返回一个包含8行的结果集。这对我来说似乎很令人惊讶。是否应该返回比现有行更多的行,或者在查询中是否有错误?如果需要,我可以发布测试表。 – 2010-06-07 20:56:09
@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
谢谢,这个答案也适用于我。 – cambo 2010-06-09 16:44:58
为什么不:
select *
from Transaction_Entries
where transaction_id In (select id,
from transactions
group by reference_number)
数据库和版本? – 2010-06-07 20:48:16