【发布时间】:2010-06-07 20:45:20
【问题描述】:
我有一个 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 不匹配但符合加入条件。
【问题讨论】:
标签: sql join performance