TableA(A1,A2)
TableB(B1,B2)
TableAB(id,A1,B1)
TableA和TableB是多對多關系,通過中間表TableAB連接
TableC(C1,A1,AmountC)
TableD(D1,A1,AmountD)
TableC和TableD通過A1字段和TableA連接,是多對一關系
第一種方法
select A1,A2
from TableA
left join
(
select B1,B2,A1
from TableB
left join TableAB
on TableAB.B1 = TableB.B1
) TableBNew on TableBNew.A1 = TableA.A1
left join
(
select C1,sum(AmountC),A1
from TableC
group by A1
) TableCNew on TableCNew.A1 = TableA.A1
left join
(
select D1,sum(AmountD),A1
from TableD
group by A1
) TableDNew on TableDNew.A1 = TableA.A1
第二種方法
select TableANew2.A1,TableANew2.A2,TableANew2.AmountC,TableANew2.AmountD,TableB.B1,TableB.B2
from
(
select TableANew.A1,TableANew.A2,TableANew.AmountC,sum(TableD.AmountD)
from
(
select A1,A2,sum(TableC.AmountC) AmountC
from TableA
left join TableC
on TableC.A1 = TableA.A1
group by TableA.A1
) TableANew
left join TableD
on TableD.A1 = TableANew.A1
group by TableANew.A1
)TableANew2
left join TableAB
on TableAB.A1 = TableANew2.A1
left join TableB
on TableB.B1 = TableAB.B1
第一種方式通過子查詢,索引很難發揮作用
第二種方式表逐層嵌入查詢,通過對比測試,如果配合索引的話,比第一種方式快一個數量級以上。
