2012-10-02 66 views
3

我正在更新使用旧外部连接的旧建筑的查询(= *和* =)。我有3个表,我需要包括在一个外部联接。左外部连接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 
       ) 
      ) 

出于某种原因,我得到的错误:

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

Yopu可能会发现wehn你这样做是因为外部的连接,您已经diffeernt结果比过去隐式语法在许多情况下都会产生不正确的结果,即使早于SQL Server 2000也是如此。因此,您正在修复的每个查询都可能不正确。你可能会得到坏结果混合implict和显式语法,你必须转换所有连接以获得正确的结果。 – HLGEM

+0

这对某些情况可能是正确的,这就是为什么我要对它们进行大量测试以确保它们产生准确的结果。谢谢你的提示。 – JRGuay

回答

6

有声明

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

后逗号这是因为你之后有tbJobs,当它应该是其他表所示。我建议使用CROSS JOIN而不是在FROM子句中使用多个表,因为它会更清晰。

下面是应该工作的查询的基本重写,尽管您应该能够轻松地摆脱大部分交叉连接。

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。我更新了我的问题w /交叉连接使用。 –

3

您不能混用不同的SQL语法。如果你打算使用ANSI-92,你需要纠正所有连接,而不仅仅是外部连接。一致性是关键。

现在,逗号是不正确的语法。你需要为每个表添加一个连接,或者将每个表的连接拉出来,交给达伦的答案。 这是问题:

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 
+0

它实际上有很大的意义,只有我没有列连接其他表格请参阅原始查询?不知道如何拉出一个。 – JRGuay