select A.code,nvl((select sum(C.a) from C where C.aid = A.aid and C.bid = B.bid ),0) from A,B where A.code = B.code,C表資料可能為空,目前效率很慢,能否優化SQL
uj5u.com熱心網友回復:
快不快跟資料特征有關。實在不行就上索引把select a.a_code,
nvl(sum(c.a), 0)
from (
select A.code a_code,
B.code b_code
from A, B
where A.code = B.code
) a,
c
where a.a_code = c.aid(+)
and a.b_code = c.bid(+)
group by a.a_code
;
uj5u.com熱心網友回復:
這個查詢基本上不會快的,因為兩張表都是全表參與連接,除非A、B兩表其中有一張是小表,而且兩表join之后的資料量也很小,那么還可以用索引優化。此外,C表的連接欄位必須有索引,否則這種標量子查詢會翻車的。。。
uj5u.com熱心網友回復:
有沒有加索引?uj5u.com熱心網友回復:
已加索引,效果不大uj5u.com熱心網友回復:
把子查詢等價轉換主查詢,如果A B表列很多,建2個組合索引 (code,aid) (code,bid)uj5u.com熱心網友回復:
樓主上執行計劃吧,而且這個SQL你想秒出,基本上不太可能,資料分布要非常湊巧才可以。uj5u.com熱心網友回復:
樓主這典型的標量子查詢啊,改寫吧:select A.code,nvl(c.sm,0), from A,B,(select aid,bid,sum(C.a) sm from C group by aid,bid ) c
where A.code = B.code
and a.aid=c.aid(+)
and b.bid=c.bid(+);
大概就這樣改吧。
uj5u.com熱心網友回復:
select A.code,(select nvl(sum(C.a),0) from C whereexists(select 0 from A where A.aid = C.aid) and
exists(select 0 from B where B.aid = C.aid)
) from A
where exists(select 0 from B where B.code = A.code) ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26376.html
標籤:基礎和管理
