2011-09-19 54 views
1

我已經繼承了設計不佳的Access 2002數據庫。我正試圖解決一些疑問,特別是一個查詢讓我撓了撓頭。它將多個連接嵌套到同一個表中...每個連接嵌套在前一個連接中,而不是多次連接到同一個表。我真的不能肯定地說爲什麼這個查詢的工作原理 - 我從來沒有見過以這種方式創建連接...任何人都可以評論這些內部連接的效果(性能明智嗎?),我會看到由un打開他們?訪問2002 - 幾個級別的嵌套內部連接到同一個表(與常規的內部連接)?

例子:

--Detals cut 
FROM tempMapIDs INNER JOIN 
(BenefitMapRiders AS RxDeduct INNER JOIN 
(BenefitMapRiders AS SubAbuse INNER JOIN 
(BenefitMapRiders AS Infertility INNER JOIN 
(BenefitMapRiders AS Dental INNER JOIN 
(BenefitMapRiders AS Chiro INNER JOIN 
(BenefitMapRiders AS Vision INNER JOIN 
(BenefitMapRiders AS Drug INNER JOIN qryOptionsMap ON Drug.NewRiderOption = qryOptionsMap.Drug) 
ON Vision.NewRiderOption = qryOptionsMap.Vision) 
ON Chiro.NewRiderOption = qryOptionsMap.Chiro) 
ON Dental.NewRiderOption = qryOptionsMap.Dental) 
ON Infertility.NewRiderOption = qryOptionsMap.Infertility) 
ON SubAbuse.NewRiderOption = qryOptionsMap.SubAbuse) 
ON RxDeduct.NewRiderOption = qryOptionsMap.RxDeduct) 

ON (tempMapIDs.NewDate = qryOptionsMap.RenewalDate) 
    AND (tempMapIDs.NewPlanOption = qryOptionsMap.PlanOption) 
    AND (tempMapIDs.RxDeduct = RxDeduct.OldRiderOption) 
    AND (tempMapIDs.SubAbuse = SubAbuse.OldRiderOption) 
    AND (tempMapIDs.Infertility = Infertility.OldRiderOption) 
    AND (tempMapIDs.Chiro = Chiro.OldRiderOption) 
    AND (tempMapIDs.Vision = Vision.OldRiderOption) 
    AND (tempMapIDs.Dental = Dental.OldRiderOption) 
    AND (tempMapIDs.Drug = Drug.OldRiderOption) 
    AND (tempMapIDs.MapID = RxDeduct.MapID) 
    AND (tempMapIDs.MapID = SubAbuse.MapID) 
    AND (tempMapIDs.MapID = Infertility.MapID) 
    AND (tempMapIDs.MapID = Chiro.MapID) 
    AND (tempMapIDs.MapID = Vision.MapID) 
    AND (tempMapIDs.MapID = Dental.MapID) 
    AND (tempMapIDs.MapID = Drug.MapID) 
) 

回答

3

這只是訪問的方式往往當您使用可視化查詢設計器來創建他們編寫查詢。它不應該比你習慣的等效語法更差。

使用可視化設計器創建具有2個或3個連接的新查詢,您將看到相同的語法。

0

如果查詢性能不佳,您應該確保連接中使用的字段已編入索引。

2

我想我知道你來自哪裏。爲了便於閱讀和維護,我寧願編寫相同的連接以保持ON子句接近JOIN子句的方式。 :

FROM 
    tempMapIDs 

    INNER JOIN qryOptionsMap 
     ON tempMapIDs.NewDate = qryOptionsMap.RenewalDate 
      AND tempMapIDs.NewPlanOption = qryOptionsMap.PlanOption 

    INNER JOIN BenefitMapRiders AS RxDeduct 
     ON tempMapIDs.MapID = RxDeduct.MapID 
      AND tempMapIDs.RxDeduct = RxDeduct.OldRiderOption 
      AND RxDeduct.NewRiderOption = qryOptionsMap.RxDeduct 

    INNER JOIN BenefitMapRiders AS SubAbuse 
     ON tempMapIDs.MapID = SubAbuse.MapID 
      AND tempMapIDs.SubAbuse = SubAbuse.OldRiderOption 
      AND SubAbuse.NewRiderOption = qryOptionsMap.SubAbuse 

    INNER JOIN BenefitMapRiders AS Infertility 
     ON tempMapIDs.MapID = Infertility.MapID 
      AND tempMapIDs.Infertility = Infertility.OldRiderOption 
      AND Infertility.NewRiderOption = qryOptionsMap.Infertility 

    INNER JOIN BenefitMapRiders AS Dental 
     ON tempMapIDs.MapID = Dental.MapID 
      AND tempMapIDs.Dental = Dental.OldRiderOption 
      AND Dental.NewRiderOption = qryOptionsMap.Dental 

    INNER JOIN BenefitMapRiders AS Chiro 
     ON tempMapIDs.MapID = Chiro.MapID 
      AND tempMapIDs.Chiro = Chiro.OldRiderOption 
      AND Chiro.NewRiderOption = qryOptionsMap.Chiro  

    INNER JOIN BenefitMapRiders AS Vision 
     ON tempMapIDs.MapID = Vision.MapID 
      AND tempMapIDs.Vision = Vision.OldRiderOption 
      AND Vision.NewRiderOption = qryOptionsMap.Vision 

    INNER JOIN BenefitMapRiders AS Drug 
     ON tempMapIDs.MapID = Drug.MapID 
      AND tempMapIDs.Drug = Drug.OldRiderOption 
      AND Drug.NewRiderOption = qryOptionsMap.Drug 

請注意,上述聯接不是嵌套的,因此優化程序可以按照它認爲合適的順序自由評估它們。

但是,以上是無效的訪問(ACE,Jet,無論)語法(可悲的是,它不支持SQL標準)。相反,它強制你將每個連接放在括號內。就我個人而言,我會保留上述結構中的連接,並以使其儘可能不顯眼的方式添加括號。

FROM (((((((
    tempMapIDs 

    INNER JOIN qryOptionsMap 
     ON tempMapIDs.NewDate = qryOptionsMap.RenewalDate 
      AND tempMapIDs.NewPlanOption = qryOptionsMap.PlanOption 
    ) 
    INNER JOIN BenefitMapRiders AS RxDeduct 
     ON tempMapIDs.MapID = RxDeduct.MapID 
      AND tempMapIDs.RxDeduct = RxDeduct.OldRiderOption 
      AND RxDeduct.NewRiderOption = qryOptionsMap.RxDeduct 
    ) 
    INNER JOIN BenefitMapRiders AS SubAbuse 
     ON tempMapIDs.MapID = SubAbuse.MapID 
      AND tempMapIDs.SubAbuse = SubAbuse.OldRiderOption 
      AND SubAbuse.NewRiderOption = qryOptionsMap.SubAbuse 
    ) 
    INNER JOIN BenefitMapRiders AS Infertility 
     ON tempMapIDs.MapID = Infertility.MapID 
      AND tempMapIDs.Infertility = Infertility.OldRiderOption 
      AND Infertility.NewRiderOption = qryOptionsMap.Infertility 
    ) 
    INNER JOIN BenefitMapRiders AS Dental 
     ON tempMapIDs.MapID = Dental.MapID 
      AND tempMapIDs.Dental = Dental.OldRiderOption 
      AND Dental.NewRiderOption = qryOptionsMap.Dental 
    ) 
    INNER JOIN BenefitMapRiders AS Chiro 
     ON tempMapIDs.MapID = Chiro.MapID 
      AND tempMapIDs.Chiro = Chiro.OldRiderOption 
      AND Chiro.NewRiderOption = qryOptionsMap.Chiro  
    ) 
    INNER JOIN BenefitMapRiders AS Vision 
     ON tempMapIDs.MapID = Vision.MapID 
      AND tempMapIDs.Vision = Vision.OldRiderOption 
      AND Vision.NewRiderOption = qryOptionsMap.Vision 
    ) 
    INNER JOIN BenefitMapRiders AS Drug 
     ON tempMapIDs.MapID = Drug.MapID 
      AND tempMapIDs.Drug = Drug.OldRiderOption 
      AND Drug.NewRiderOption = qryOptionsMap.Drug 

注意上面僅僅給出了外觀嵌套加入,但在現實的優化仍然是免費的,以評估他們在任何順序(這會導致丟失的功能 - 不能指定一個明確的順序 - 但那是爲你準備的!)