2011-05-14 163 views
1

我有2個查詢:一個是用ANSI SQL編寫的,另一個是用oracle方言編寫的。 我認爲他們都必須給出相同的結果集,但這不是事實。首先查詢提供了385行,第二 - 只有25兩個相同的查詢給出不同的結果

第一:

SELECT idclient, cl.surname, sum(sub1.s) 
    FROM client cl JOIN incomestatement incst USING(idclient) 
        JOIN (SELECT c.idincome ID, sum(inst.total) AS s 
         FROM instalment inst JOIN credit c USING(idcredit) 
         WHERE inst.paydate > c.paydate AND c.isloaned = 1 
         GROUP BY c.idincome) sub1 ON incst.idincome = sub1.ID 
    GROUP BY idclient, cl.surname; 

二:

SELECT c.idclient, c.surname, sum(sub.s) 
FROM client c, incomestatement inc, 
     (SELECT sum(inst.total) as s, cr.idincome as id 
     FROM instalment inst, credit cr 
     WHERE inst.paydate > cr.paydate AND cr.isloaned = 1 AND cr.idcredit = inst.idcredit 
     GROUP BY cr.idincome 
     ) sub 
WHERE c.idclient = inc.idclient AND inc.income = sub.ID 
group by c.idclient, c.surname; 

那麼,爲什麼他們不給同樣的結果?

回答

1

我會逐步解決問題。

  1. 這兩個子查詢是否產生相同的數據集?
    • 如果是這樣,請繼續執行步驟2.
    • 如果不是,那麼您有兩個更簡單的查詢來分析和剖析。
  2. 鑑於對子查詢產生相同的答案,你就可以建立客戶端是否和利潤表加入給出了相同的結果(把它當作另一個子查詢)
    • 如果他們這樣做,請繼續執行步驟3.
    • 如果不是,則您有一對查詢(一個帶有JOIN,一個帶有經典SQL符號)來分析和剖析。
  3. 鑑於連接對和子查詢對都產生相同的結果,請分析爲什麼這些連接無法正常工作。
+0

是的,兩個子查詢產生相同的數據集並且Client和IncomeStatement加入(例如:使用(idclient)從客戶端加入incomestatement中選擇idclient(idclient))生成相同的數據集。這些查詢甚至具有相同的計劃。但我不知道他們爲什麼給不同的數據集 – maks 2011-05-14 14:53:30

+0

謝謝,我已經解決了這個問題。我在第二個查詢inc.income = sub.ID中誤認了。相反,我必須編寫inc.idincome = sub.ID,因爲idincome是主鍵 – maks 2011-05-14 15:07:10

+0

這很奇怪......唯一的其他分解步驟是編寫沒有GROUP BY和SUM的最外層查詢(您只需選擇' sub.s'或'sub1.s'的值。這些也應該是相同的,因爲你到目前爲止所說的話,但這是我能看到的唯一的其他東西。**哦,你解決了它.. 。好! – 2011-05-14 15:09:05

0

你提交了嗎? 有可能你沒有進行一些交易,所以結果可能不同。

+0

不,問題不在提交。我在啓動數據庫後運行了這些查詢。 – maks 2011-05-14 14:11:54

相關問題