2012-10-02 293 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