2009-03-10 7 views
9

J'ai la demande suivante:Dois-je utiliser le mot-clé sql JOIN pour les jointures complexes sur plusieurs tables?

select * 
    from tbA A, tbB B, tbC C, tbD D 
where 
    A.ID=B.ID and B.ID2= C.ID2 and A.ID=D.ID and C.ID3=D.ID3 and B.ID4=D.ID4 
and 
    A.Foo='Foo' 

Je l'ai entendu à plusieurs reprises que cette syntaxe de jointure est amorti, et que je devrais utiliser le mot-clé 'JOIN à la place. Comment faire cela dans une jointure si compliquée (plusieurs tables jointes sur plusieurs colonnes appartenant à différentes tables)? Pensez-vous que cette meilleure pratique s'applique toujours ici?

+0

La bonne chose à propos en utilisant le format ANSI est que la jointure logique est séparée de votre logique de filtrage. Il est très clair de voir comment les tables sont liées en un coup d'œil. – Barry

+0

Oui, c'est obsolète.Et oui vous devriez nettoyer votre sql. – NotMe

+0

@Chris: Eh bien, il semble que l'utilisation de cette syntaxe ne soit pas déconseillée, alors que l'utilisation de * (faire des jointures à gauche) est (elle est détaillée dans une autre réponse). En ce qui concerne le SQL, je l'ai juste écrit comme exemple – Brann

Répondre

10

C'est une question de goût, mais j'aime mieux le mot-clé JOIN. Cela rend la logique plus claire et plus cohérente avec la syntaxe LEFT OUTER JOIN qui l'accompagne. Notez que vous pouvez également utiliser INNER JOIN, qui est associé à JOIN.

La syntaxe est

a JOIN b 
    ON expression relating b to all of the tables before 

b peut être se rejoindre. Pour jointures internes, il n'a pas d'importance, mais pour extérieur, vous pouvez contrôler l'ordre des jointures comme ceci:

select * from 
    a left join 
     d join c 
     on d.i = c.i 
    on a.k = d.k 

Voici une gauche est reliée à la jointure entre d et c.

Voici votre requête:

select * 
    from tbA A 
    join tbB B on A.ID = B.ID 
    join tbC C on B.ID2 = C.ID2 
    join tbD D on A.ID = D.ID and C.ID3 = D.ID3 and B.ID4 = D.ID4 
where 
    A.Foo='Foo' 
5

je trouve rejoindre la syntaxe beaucoup plus facile à comprendre

select * 
from tbA A 
inner join tbB B on a.id = b.id 
inner join tbC C on b.id2 = c.id2 
inner join tbD D on a.id = d.id and c.id3 = d.id3 and b.id4 = d.id4 
where A.Foo='Foo' 

Maintenant, vous pouvez voir clairement comment les données sont reliées entre elles et que ce n'est pas une jointure très complexe tout à fait. Par ailleurs, dans notre exemple, la conception de la base de données a fortement tendance à manquer de normalisation. Habituellement vous devriez avoir une table joignant à beaucoup (une jointure b sur a.bid = b.bid joignant c sur a.cid = c.cid) ou une chaîne (une jointure b sur a.bid = b.bid join c sur b.cid = c.cid).

EDIT. Ajout du mot-clé facultatif INNER qui ne change pas le résultat, mais le rend plus clair.

+0

avez-vous répété «a.id = b.id» deux fois? – Brann

+0

Cela devrait être a.id = d.id3. –

+0

en fait il devrait être a.id = d.id :) Post corrigé. Btw, ce simple problème avec la dénomination montre clairement pourquoi la conception n'est pas correcte. – user76035

2
SELECT * 
FROM tba AS a 
    JOIN tbb AS b ON a.id = b.id 
    JOIN tbc AS c ON b.id2 = c.id2 
    JOIN tbd AS d ON a.id = d.id AND c.id3 = d.id3 AND b.id4 = d.id4 
WHERE 
    a.foo = 'Foo' 

Bien que j'aie du mal à imaginer tout besoin pour cela. Bare pour donner un exemple, ou eh des noms de table plus descriptifs? Syntaxe

2

JOIN est plus lisible (même si je préfère la syntaxe WHERE dans les cas simples), et, ce qui est plus important, peut gérer INNER et OUTER rejoint de manière plus claire.

WHERE n'est pas déprécié et ne le sera probablement jamais.

Il est obsolète seulement dans le sens que différentes solutions de contournement OUTER JOIN (comme (*) et (+)) sont obsolètes.

Il n'y a rien que vous ne pouvez faire avec JOIN que vous pouvez faire avec WHERE, mais pas vice versa.

+0

En effet. Maintenant je me souviens avoir vu ce message en utilisant * dans une jointure – Brann

Questions connexes