118 votes

Quelles sont les utilisations de Cross Join?

Une jointure croisée effectue un produit cartésien sur les n-uplets des deux ensembles.

 SELECT *
FROM Table1
CROSS JOIN Table2
 

Quelles circonstances rendent une telle opération SQL particulièrement utile?

109voto

Dave DuPlantis Points 3176

Si vous avez une "grille" que vous voulez remplir complètement, comme la taille et la couleur de l'information pour un article particulier de vêtements:

select 
    size,
    color
from
    sizes CROSS JOIN colors

Peut-être que vous voulez une table qui contient une ligne pour chaque minute de la journée, et que vous voulez l'utiliser pour vérifier qu'une procédure est exécutée à chaque minute, de sorte que vous pourriez traverser trois tables:

select
    hour,
    minute
from
    hours CROSS JOIN minutes

Ou vous avez un ensemble de rapports standard spécifications que vous souhaitez appliquer à tous les mois dans l'année:

select
    specId,
    month
from
    reports CROSS JOIN months

Le problème avec le maintien de ces points de vue, c'est que dans la plupart des cas, vous ne voulez pas un produit complet, particulièrement concernant les vêtements. Vous pouvez ajouter MINUS logique de la requête pour supprimer certaines combinaisons que vous ne la portez pas, mais vous pouvez trouver plus facile de remplir un tableau d'une autre façon et de ne pas utiliser un produit Cartésien.

Aussi, vous pourriez essayer la croix de jointure sur les tables qui ont peut-être un peu plus de lignes que vous le pensiez, ou peut-être votre WHERE clause a été partiellement ou totalement absents. Dans ce cas, votre DBA vous en informerons dans les meilleurs délais de l'omission. Habituellement, il ou elle ne sera pas heureux.

32voto

Ovidiu Pacurar Points 5129

Générez des données pour les tests.

15voto

Randy Points 3196

En règle générale, vous ne souhaiterez pas un produit cartésien complet pour la plupart des requêtes de base de données. Toute la puissance des bases de données relationnelles réside dans le fait que vous pouvez appliquer toutes les restrictions qui pourraient vous intéresser afin d'éviter de tirer des lignes inutiles de la base de données.

Je suppose qu’un exemple artificiel pourrait vous intéresser, c’est si vous avez un tableau des employés et un tableau des tâches qui doivent être effectuées et que vous souhaitez voir toutes les affectations possibles d’un employé à un travail.

14voto

James Curran Points 55356

Ok, ce ne sera probablement pas répondre à la question, mais, si c'est vrai (et je ne suis même pas sûr de ça) c'est un plaisir de peu d'histoire.

Dans les premiers jours de l'Oracle, l'un des développeurs a réalisé qu'il avait besoin de dupliquer chaque ligne de la table (il est possible que c'était un tableau des événements et qu'il avait besoin de le changer "événement" et "la fin de l'événement"). Il comprit que, s'il avait une table avec seulement deux lignes, il peut faire une jointure croisée, en sélectionnant simplement les colonnes dans les deux premiers, et obtenir exactement il avait besoin. Il a donc créé un tableau simple, il a tout naturellement appelé "DOUBLE".

Plus tard, il a besoin de faire quelque chose qui ne pourrait se faire via une sélection à partir d'une table, même si l'action elle-même n'avait rien à faire avec la table, (peut-être qu'il a oublié sa montre et je voulais lire le temps via SELECT SYSDATE from...) Il s'est rendu compte qu'il avait toujours son DOUBLE tableau qui traînent, et utilisé. Après un certain temps, il a assez de voir l'heure imprimée deux fois, donc il éventuelle supprimé l'une des lignes.

D'autres à Oracle a commencé à l'aide de sa table, et, finalement, il a été décidé de l'inclure dans la norme de l'installation d'Oracle.

Ce qui explique pourquoi une table dont le seul intérêt est qu'il a une ligne a un nom qui signifie "deux".

4voto

Joel Coehoorn Points 190579

Prend quelque chose comme une table de chiffres, qui a dix lignes pour les chiffres de 0 à 9. Vous pouvez utiliser la jointure croisée plusieurs fois sur cette table pour obtenir un résultat contenant le nombre de lignes souhaité, avec les résultats numérotés de manière appropriée. Cela a un certain nombre d'utilisations. Par exemple, vous pouvez le combiner avec une fonction datadd () pour obtenir un ensemble pour chaque jour d'une année donnée.

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