2014-06-27 322 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语法。数十年来,逗号语法已经过时(但完全支持)。