2014-06-27 321 views
0

我的查詢的精簡版本在下面(因爲有多少變量),當我運行子查詢本身時它運行在2秒內,但是當我圍繞它時,它需要超過半小時。我檢查了所有列名 - 兩次。這是爲什麼發生?我能做些什麼來解決它?需要很長時間的Oracle查詢

SELECT Amount, Comments, FirstName, LastName, TermName, AdjustmentType, Void_Indicator FROM ( Select c.amount amount, c.comments comments, p.firstname firstname, p.lastname lastname, e.termname termname, c.adjustmenttype adjustmenttype, b.voidindicator void_indicator From ChargesDTL c, ChargesHDR b, PeopleHDL p, TermMaster e Where ( b.studentnumber=p.studentnumber and c.termid = e.term_id and b.adjustmentnumber=c.adjustmentnumber and p.personID=b.personID and b.locationcode='12' ) Union Select c.amount amount, c.comments comments, p1.firstname firstname, p1.lastname lastname, e.termname termname, c.adjustmenttype adjustmenttype, b.voidindicator void_indicator From ChargesDTL c, ChargesHDR b, PeopleHDL p1, TermMaster e Where ( b.studentnumber=p.studentnumber and c.termid = e.term_id and b.adjustmentnumber=c.adjustmentnumber and p1.personId = b.personId and b.locationcode='13' ) order by adjustmenttype )

+0

這可能是一個查詢。派生表不是必需的 –

回答

1

正如我在你的問題發表評論時提及。您的查詢可以通過一組聯接語句輕鬆簡化爲一個查詢。 Union和Derived表是完全不必要的。

SELECT 
    c.amount, 
    c.comments, 
    p.firstname, 
    p.lastname, 
    e.termname, 
    c.adjustmenttype, 
    b.voidindicator 
FROM ChargesDTL c 
INNER JOIN TermMaster e ON e.termid = c.term_id 
INNER JOIN ChargesHDR b ON b.adjustmentnumber = c.adjustmentnumber 
INNER JOIN PeopleHDL p ON p.personID = b.personID AND p.studentnumber = b.studentnumber 
WHERE 
    (b.locationcode = '12' OR b.locationcode = '13') 
ORDER BY c.adjustmenttype 
0

這是做你想做的嗎?

Select c.amount amount, 
    c.comments comments, 
    p1.firstname firstname, 
    p1.lastname lastname, 
    e.termname termname, 
    c.adjustmenttype adjustmenttype, 
    b.voidindicator void_indicator 
From ChargesDTL c, 
    ChargesHDR b 
    on b.adjustmentnumber = c.adjustmentnumber join 
    PeopleHDL p 
    on b.studentnumber = p.studentnumber and 
     p.personId = b.personId join 
    TermMaster e 
    on c.termid = e.term_id 
Whereb.locationcode in ('12', '13') 
order by adjustmenttype; 

您應該學會使用正確的,明確的join語法。數十年來,逗號語法已經過時(但完全支持)。