Quels sont les usages de Cross Join?

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

SELECT * FROM Table1 CROSS JOIN Table2 

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

Si vous avez une “grid” à remplir complètement, comme la taille et la couleur des informations sur un article de vêtement particulier:

 select size, color from sizes CROSS JOIN colors 

Vous voulez peut-être une table contenant une ligne pour chaque minute du jour et vous voulez l’utiliser pour vérifier qu’une procédure a été exécutée chaque minute. Vous pouvez donc traverser trois tables:

 select hour, minute from hours CROSS JOIN minutes 

Ou vous avez un ensemble de spécifications de rapport standard que vous souhaitez appliquer à chaque mois de l’année:

 select specId, month from reports CROSS JOIN months 

Le problème avec le maintien de ces vues est que, dans la plupart des cas, vous ne voulez pas un produit complet, en particulier en ce qui concerne les vêtements. Vous pouvez append une logique MINUS à la requête pour supprimer certaines combinaisons que vous ne portez pas, mais vous trouverez peut-être plus facile de remplir une table autrement et de ne pas utiliser un produit cartésien.

En outre, vous pourriez finir par essayer la jointure croisée sur des tables qui ont peut-être quelques lignes de plus que vous ne le pensiez, ou peut-être que votre clause WHERE manquait partiellement ou complètement. Dans ce cas, votre DBA vous informera rapidement de cette omission. Habituellement, il ou elle ne sera pas heureux.

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

Je suppose qu’un exemple peut être utile si vous avez une table d’employés et un tableau des tâches à accomplir et que vous voulez voir toutes les affectations possibles d’un employé à un emploi.

Ok, cela ne répondra probablement pas à la question, mais si c’est vrai (et je n’en suis même pas sûr), c’est un peu d’histoire.

Au début d’Oracle, l’un des développeurs s’est rendu compte qu’il devait dupliquer chaque ligne d’une table (par exemple, il était possible qu’il y ait une table d’événements et qu’il ait besoin de la modifier pour séparer «événement de début» et «événement de fin»). entrées). Il s’est rendu compte que s’il avait une table avec seulement deux lignes, il pourrait faire une jointure croisée, en sélectionnant seulement les colonnes dans la première table, et obtenir exactement ce dont il avait besoin. Il a donc créé un tableau simple, qu’il a naturellement appelé “DUAL”.

Plus tard, il doit faire quelque chose qui ne peut être fait que via une sélection dans une table, même si l’action elle-même n’a rien à voir avec la table (peut-être at-il oublié sa montre via SELECT SYSDATE FROM). .) Il s’est rendu compte qu’il avait toujours sa table DUAL et l’a utilisé. Au bout d’un moment, il en avait assez de voir l’heure imprimée deux fois, il a donc supprimé une des lignes.

D’autres utilisateurs d’Oracle ont commencé à utiliser sa table et finalement, il a été décidé de l’inclure dans l’installation standard d’Oracle.

Ce qui explique pourquoi une table dont la seule signification est une ligne a un nom qui signifie “deux”.

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

La clé est “montrez-moi toutes les combinaisons possibles”. Je les ai utilisés en conjonction avec d’autres champs calculés et les ai ensuite sortingés / filtrés.

Par exemple, supposons que vous construisiez une application d’arbitrage (trading). Vous avez des vendeurs offrant des produits à un prix et des acheteurs demandant des produits à un coût. Vous effectuez une jointure croisée sur la clé de produit (pour faire correspondre les acheteurs et les vendeurs potentiels), calculez l’écart entre le coût et le prix, puis sortingez par ordre décroissant. sur ceci pour vous donner (les intermédiaires) les métiers les plus rentables à exécuter. Vous aurez presque toujours d’autres critères de filtrage.

Prend quelque chose comme un tableau de chiffres, qui a dix lignes pour les chiffres 0-9. Vous pouvez utiliser la jointure croisée sur cette table à quelques resockets pour obtenir un résultat qui comporte le nombre de lignes nécessaire, les résultats étant 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.

C’est un moyen intéressant d’utiliser une jointure croisée pour créer un rapport d’parsing croisée. Je l’ai trouvé dans SQL For Smarties de Joe Celko , et je l’ai utilisé plusieurs fois. Cela prend un peu de configuration, mais a valu le temps investi.

Imaginez que vous souhaitiez émettre une série de requêtes sur une combinaison spécifique d’éléments et de dates (prix, disponibilité, etc.). Vous pouvez charger les éléments et les dates dans des tables temporaires distinctes et faire en sorte que vos requêtes rejoignent les tables. Cela peut être plus pratique que d’alterner l’énumération des éléments et des dates dans les clauses IN, d’autant plus que certaines bases de données limitent le nombre d’éléments dans une clause IN.