55 votes

Quelle est la différence entre l'utilisation d'une jointure croisée et l'insertion d'une virgule entre les deux tables ?

Quelle est la différence entre

select * from A, B

y

select * from A cross join B

? Ils semblent donner les mêmes résultats.

La deuxième version est-elle préférée à la première ? La première version est-elle complètement erronée sur le plan syntaxique ?

1 votes

Les produits cartésiens ne sont presque jamais utiles...

12 votes

Mais dans les rares cas où ils le sont, il est bon de savoir comment les écrire.

3 votes

Rarement utile, mais existe probablement au moins une fois dans chaque grand projet.

2voto

Thorsten Kettner Points 6149

Pour compléter les réponses déjà données :

select * from A, B

C'était la seule façon de procéder avant l'adoption de la norme SQL de 1992. Ainsi, si vous vouliez une jointure interne, vous deviez utiliser la méthode WHERE pour les critères :

select * from A, B
where A.x = B.y;

L'un des problèmes de cette syntaxe est qu'il n'existe pas de norme pour les jointures externes. Un autre problème est que cette syntaxe devient illisible avec de nombreuses tables et qu'elle est donc sujette à des erreurs et moins facile à maintenir.

select * from A, B, C, D
where B.id = C.id_b
and C.id_d = D.id;

Il s'agit ici d'une jonction croisée entre A et B/C/D. Fait-il exprès ou non ? Peut-être que le programmeur a simplement oublié le and B.id = A.id_b (ou autre), ou peut-être que cette ligne a été supprimée par erreur, et peut-être encore qu'il s'agissait en réalité d'une jointure croisée. Qui pourrait le dire ?

Voici la même chose avec des jointures explicites

select * 
from A
cross join B
inner join C on C.id_b = B.id
inner join D on D.id = C.id_d;

Il n'y a plus de doute sur les intentions des programmeurs.

L'ancienne syntaxe séparée par des virgules a été remplacée pour de bonnes raisons et ne doit plus être utilisée.

1voto

eugene y Points 37378

Voici des exemples de jointures croisées implicites et explicites. Voir http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join .

0voto

John Barça Points 2740

En ce qui concerne les commentaires sur l'utilité des jointures croisées, il existe un exemple très utile et valable d'utilisation des jointures croisées ou des virgules dans le monde, certes quelque peu obscur, de Postgres generate_series et Postgis spatial sql, où vous pouvez utiliser une jointure croisée contre generate_series pour extraire la nième géométrie d'une collection de géométries ou d'un Multi-(Polygone/Point/Ruban), voir : http://postgis.refractions.net/documentation/manual-1.4/ST_GeometryN.html

SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt
  FROM (
    VALUES (ST_GeomFromEWKT('MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)') ),
          ( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') )
    )  As foo(the_geom)
CROSS JOIN generate_series(1,100) n
  WHERE n <= ST_NumGeometries(the_geom);

Cela peut s'avérer très utile si vous souhaitez obtenir l'aire, le centroïde, la boîte de délimitation ou de nombreuses autres opérations que vous pouvez effectuer sur une géométrie unique, lorsqu'elle est contenue dans une géométrie plus grande.

J'ai toujours écrit de telles requêtes en utilisant une virgule avant generate_series, jusqu'au jour où je me suis demandé si cela signifiait vraiment une jointure croisée, ce qui m'a amené à cet article. Obscur, mais définitivement utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X