2011-09-19 56 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 

注意上面仅仅给出了外观嵌套加入,但在现实的优化仍然是免费的,以评估他们在任何顺序(这会导致丢失的功能 - 不能指定一个明确的顺序 - 但那是为你准备的!)