2011-09-19 4 views
1

잘못 설계된 Access 2002 데이터베이스를 상속 받았습니다. 몇 가지 쿼리 문제를 해결하기 위해 노력하고 있는데 특히 한 가지 쿼리로 인해 내 머리가 긁히는 경우가 있습니다. 같은 테이블에 여러 개의 조인을 중첩하는 중입니다 ... 각 조인은 여러 번 동일한 테이블에 조인하는 것이 아니라 이전 조인에 중첩됩니다. 나는 솔직히이 쿼리가 작동하는 이유를 확실히 말할 수 없다 - 나는 이런 방식으로 생성 된 조인을 본 적이 없다 ... 누구나이 내부 조인 (성능 현명한)의 효과에 대해 의견을 말할 수 있으며 un에 의한 성능 향상을 볼 수있을 것이다. - 그들을 모아?Access 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 

하는 것으로, 따라서 최적화는 적합한 어떤 순서로 평가 무료입니다.

그러나 위의 Access (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 

참고 위의 단지 중첩의이 조인 모양을 제공하지만, 현실에서 최적화는 여전히 (이 기능이 손실을 초래 어떤 순서로 평가 자유롭게 - 명시 적으로 순서를 지정할 수 없습니다 -하지만 그건 당신을위한 액세스입니다!)