我有一个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不匹配但与匹配条件匹配。
答案 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)