LEFT OUTER JOIN 3 tables

Je mets à jour les requêtes qui utilisaient l'ancienne construction pour les jointures externes (= * et * =). J'ai 3 tables que j'ai besoin d'inclure dans une jointure externe.

La requête d'origine est:

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 ) ) 

Je fais:

 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 ) ) 

Pour une raison quelconque, je reçois l'erreur:

L'identificateur en plusieurs parties "s.SkillID" n'a pas pu être lié.

Et je sais que c'est dans cette partie:

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

Je ne suis pas sûr de ce que je fais mal.

Merci toute aide. Jose

    Il y a une virgule après la déclaration

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

    C'est parce que vous avez tbJobs après, quand il devrait être dans les autres tables. Je recommand d'utiliser CROSS JOIN au lieu de simplement avoir plusieurs tables dans la clause FROM, car ce sera plus clair.

    Voici la réécriture de base de votre requête qui devrait fonctionner, même si vous devriez pouvoir vous débarrasser facilement de la plupart des jointures croisées.

     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 ) ) 

    Vous ne pouvez pas mélanger les différentes syntaxes SQL. Si vous utilisez ANSI-92, vous devez corriger toutes les jointures, pas seulement les jointures externes. La cohérence est la key.

    La virgule est la syntaxe incorrecte maintenant. Vous devez append une jointure pour chaque table, ou les sortir en croix s'applique par la réponse de Darren. C'est le problème:

     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 

    il doit être dans le sens de:

      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