2012-06-22 2 views
2

Je suis old school et j'ai toujours utilisé le signe "+" pour représenter outer, mais ce sql ne fonctionne pas dans sql server. Quelqu'un peut-il m'aider à convertir le sql suivant dans le nouveau format "left outer join".Convert ancien "+" Rejoindre la syntaxe SQL Server?

select frdonmst.FRID, 
     fradrmst.adrseq, 
     fax.phone as fax, 
     phone.phone as phone 
from frdonmst, 
     fradrmst, 
     frphnmst fax, 
     frphnmst phone 
where frdonmst.frid = fradrmst.frid 
     and frdonmst.adrseq = fradrmst.adrseq 
     and (frdonmst.frid = fax.frid(+) 
      and frdonmst.adrseq = fax.adrseq(+) 
      and fax.phtyp(+) = 'FAX1') 
     and (frdonmst.frid = phone.frid(+) 
      and frdonmst.adrseq = phone.adrseq(+) 
      and phone.phtyp(+) = 'D1') 
+1

NB - Ancienne école dans ce cas signifie que vous utilisez Oracle avant que les normes ANSI. – Hogan

+0

si cela avait été posté à la foule C# vous auriez probablement dû utiliser [MSDN] (http://msdn.microsoft.com/en-us/library/ms187518 (v = sql.105) .aspx). La foule de sql est un si bon groupe cependant .... regardez toutes les réponses – whytheq

Répondre

5

Je vais tenter le coup, mais je n'ai jamais vu un signe plus utilisé dans cette capacité. :)

SELECT a.FRID 
    , b.adrseq 
    , fax.phone AS fax 
    , phone.phone AS phone 
FROM frdonmst a 
JOIN fradrmst b 
    ON a.adrseq = b.adrseq 
LEFT JOIN frphnmst fax 
    ON a.frid = fax.frid 
    AND a.adrseq = fax.adrseq 
    AND fax.phtyp = 'FAX1' 
LEFT JOIN frphnmst phone 
    ON a.frid = phone.frid 
    AND a.adrseq = phone.adrseq 
    AND phone.phtyp = 'D1' 

P.S. Après avoir tapé ceci à la main, je recommanderais poliment d'utiliser des mots pour nommer les choses.

+1

@ user1475911, l'ancienne manière a donné des résultats inexacts aussi loin que SQL Server 2000 parce qu'il est ambiguious et est parfois interprété comme une jointure croisée. Les jointures implicites en général sont un antipattern SQL, mais les externes ne sont même pas garantis fonctionner correctement même si l'auteur n'a pas fait une erreur comme une jointure accidentelle. – HLGEM

0

J'espère que c'est ce que vous cherchez:

select 
frdonmst.FRID, 
fradrmst.adrseq, 
faxTable.phone as fax, 
phoneTable.phone as phone 
FROM (((frdonmst LEFT JOIN fradrmst ON frdonmst.adrseq = fradrmst.adrseq and frdonmst.adrseq = fradrmst.adrseq) 
       LEFT JOIN frphnmst AS faxTable ON frdonmst.frid = faxTable.frid AND frdonmst.adrseq = faxTable.adrseq) 
       LEFT JOIN frphnmst AS phoneTable ON frdonmst.frid = phoneTable.frid AND frdonmst.adrseq = phoneTable.adrseq) 
WHERE faxTable.phtyp='FAX1' AND phoneTable.phtyp='D1' 
+1

Je suis sûr que vous n'avez pas besoin de '' ('' s dans votre requête. – Hogan