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不匹配但与匹配条件匹配.
尝试
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)