2012-10-02 2 views
3

이전 조인을 외부 조인 (= * 및 * =)으로 사용하여 쿼리를 업데이트하고 있습니다. 외부 조인에 포함시킬 테이블이 3 개 있습니다. 내가 뭘LEFT OUTER JOIN 3 테이블

SELECT s.SkillID , 
     NULL AS Signature , 
     NULL AS DPL , 
     CASE WHEN ISNULL(ds.DPL, dg.DPL) IS NULL 
      THEN p.ScaleTo - p.ScaleFrom + 1 
      ELSE ISNULL(ds.DPL, dg.DPL) 
     END AS DefaultDPL 
FROM tbJobs j , 
     tbSkills s 
     INNER JOIN tbSkillGroups sg ON s.SkillGroupID = sg.SkillGroupID , 
     tbPerfScales p , 
     tbDPLs ds , 
     tbDPLs dg 
WHERE j.JobID = 866 
     AND (ds.LevelID=*j.LevelID 
       AND ds.IDType = 1 
       AND ds.GroupOrSkillID=*s.SkillID 
      ) 
     AND (dg.LevelID=*j.LevelID 
       AND dg.IDType = 0 
       AND dg.GroupOrSkillID=*sg.SkillGroupID 
      ) 
     AND ((s.PerfScaleID IS NOT NULL 
       AND p.PerfScaleID = s.PerfScaleID 
      ) 
       OR (s.PerfScaleID IS NULL 
        AND p.PerfScaleID = sg.PerfScaleID 
       ) 
      ) 

:

SELECT s.SkillID , 
     NULL AS Signature , 
     NULL AS DPL , 
     CASE WHEN ISNULL(ds.DPL, dg.DPL) IS NULL 
      THEN p.ScaleTo - p.ScaleFrom + 1 
      ELSE ISNULL(ds.DPL, dg.DPL) 
     END AS DefaultDPL 
FROM tbPerfScales p , 
     tbSkills s 
     INNER JOIN tbSkillGroups sg ON s.SkillGroupID = sg.SkillGroupID , 
     tbJobs j 
     LEFT OUTER JOIN tbDPLs ds ON j.LevelID = ds.LevelID 
            AND s.SkillID = ds.GroupOrSkillID 
     LEFT OUTER JOIN tbDPLs dg ON j.LevelID = dg.LevelID 
            AND sg.SkillGroupID = dg.GroupOrSkillID 
WHERE j.JobID = 866 
     AND ds.IDType = 1 
     AND dg.IDType = 0 
     AND ((s.PerfScaleID IS NOT NULL 
       AND p.PerfScaleID = s.PerfScaleID 
      ) 
       OR (s.PerfScaleID IS NULL 
        AND p.PerfScaleID = sg.PerfScaleID 
       ) 
      ) 

I 오류지고있어 몇 가지 이유 :

원래 쿼리는

The multi-part identifier "s.SkillID" could not be bound.

을 그리고 난에 알고 이 부분 :

tbJobs j 
    LEFT OUTER JOIN tbDPLs ds ON j.LevelID = ds.LevelID 
           AND s.SkillID = ds.GroupOrSkillID 

내가 잘못하고있는 것이 확실하지 않습니다.

도움 주셔서 감사합니다. 호세

+0

암시 적 구문은 많은 경우 SQL Server 2000까지 거슬러 올라가서 잘못된 결과를 만들어 내었습니다. 따라서 수정하려는 모든 쿼리는 처음에는 잘못된 것일 수 있습니다. 그리고 암시 적 구문과 명시 적 구문을 혼합하여 나쁜 결과를 얻는다면 모든 조인을 올바른 결과로 변환해야합니다. – HLGEM

+0

일부 경우에 해당 될 수 있습니다. 그 때문에 정확한 결과가 나오는지 테스트하기 위해 많은 테스트를 실행하고 있습니다. 팁 고마워. – JRGuay

답변

6

당신이 그것을 후에 tbJobs을 가지고 있기 때문에 다른 테이블에 있어야 할 때, 어느 문

INNER JOIN tbSkillGroups sg ON s.SkillGroupID = sg.SkillGroupID , 

후 쉼표있다. FROM 절에 여러 테이블이있는 대신 CROSS JOIN을 사용하는 것이 더 명확 할 것이므로 권장합니다.

다음은 대부분의 교차 조인을 쉽게 제거 할 수 있지만 쿼리의 기본 다시 쓰기입니다.

SELECT s.SkillID , 
     NULL AS Signature , 
     NULL AS DPL , 
     CASE WHEN ISNULL(ds.DPL, dg.DPL) IS NULL 
      THEN p.ScaleTo - p.ScaleFrom + 1 
      ELSE ISNULL(ds.DPL, dg.DPL) 
     END AS DefaultDPL 
FROM tbPerfScales p 
     CROSS JOIN tbSkills s 
     CROSS JOIN tbJobs j 
     INNER JOIN tbSkillGroups sg ON s.SkillGroupID = sg.SkillGroupID 
     LEFT OUTER JOIN tbDPLs ds ON j.LevelID = ds.LevelID 
            AND s.SkillID = ds.GroupOrSkillID 
     LEFT OUTER JOIN tbDPLs dg ON j.LevelID = dg.LevelID 
            AND sg.SkillGroupID = dg.GroupOrSkillID 
WHERE j.JobID = 866 
     AND ds.IDType = 1 
     AND dg.IDType = 0 
     AND ((s.PerfScaleID IS NOT NULL 
       AND p.PerfScaleID = s.PerfScaleID 
      ) 
       OR (s.PerfScaleID IS NULL 
        AND p.PerfScaleID = sg.PerfScaleID 
       ) 
      ) 
+0

대런 감사합니다. 내가 원래 쿼리를 다시 작성하고 기본적으로 원하는 (필요) 이전 외부 조인 형식을 제거하는 것입니다 때문에 나는 쉼표가 있습니다. 쉼표는 조인의 다른 부분을 분리하는 것입니다. 문제가 될 수 있다고 생각하십니까? 필자는 이전 3 테이블을 이후 2 테이블에 조인 할 컬럼/방법이 없습니다. : – JRGuay

+0

예, 조인 사이에 쉼표가 없어야하므로 그냥 tbJobs를 움직여야합니다. 제 질문을 승/교차 조인 사용으로 업데이트했습니다. –

3

다른 SQL 구문을 혼합 할 수 없습니다. ANSI-92를 사용한다면 외부 조인뿐만 아니라 모든 조인을 수정해야합니다. 일관성이 중요합니다.

쉼표가 잘못된 구문입니다. 각 테이블에 대한 조인을 추가하거나 Darren의 답변에 따라 교차 적용으로 끌어 와야합니다.

FROM tbPerfScales p , 
     tbSkills s 
     INNER JOIN tbSkillGroups sg ON s.SkillGroupID = sg.SkillGroupID , 
     tbJobs j 
     LEFT OUTER JOIN tbDPLs ds ON j.LevelID = ds.LevelID 
            AND s.SkillID = ds.GroupOrSkillID 
     LEFT OUTER JOIN tbDPLs dg ON j.LevelID = dg.LevelID 
            AND sg.SkillGroupID = dg.GroupOrSkillID 

가의 라인을 따라 할 필요가 : 이이 문제입니다

FROM tbPerfScales p 
    INNER JOIN tbSkills s ON p.<field> = s.<field> 
     INNER JOIN tbSkillGroups sg ON s.SkillGroupID = sg.SkillGroupID 
     INNER JOIN tbJobs j on j.<field> = <table p? sg? not sure>.<field> 
     LEFT OUTER JOIN tbDPLs ds ON j.LevelID = ds.LevelID 
            AND s.SkillID = ds.GroupOrSkillID 
     LEFT OUTER JOIN tbDPLs dg ON j.LevelID = dg.LevelID 
            AND sg.SkillGroupID = dg.GroupOrSkillID 
Yopu는이 작업을 수행 wehn 외부가 조인 때문에 과거보다 결과를 diffeernt 한 것을 알 수 있습니다
+0

실제로 합리적인 의미를 지니 며 가입 할 열이 없습니다. 다른 테이블들. 원본 쿼리를 볼 수 있습니까? – JRGuay