2010-06-07 176 views
2

我有一個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

回答

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 

如果該帳戶擁有衆多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

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 
+0

謝謝,這個答案也適用於我。 – cambo 2010-06-09 16:44:58

0

爲什麼不:

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