2008-10-20 15 views
79

Una combinación cruzada realiza un producto cartesiano en las tuplas de los dos conjuntos.¿Cuáles son los usos de Cross Join?

SELECT * 
FROM Table1 
CROSS JOIN Table2 

¿Qué circunstancias hacen que una operación de SQL así sea especialmente útil?

+19

Es muy triste que esta pregunta se haya cerrado. Creo que podría marcarse Community Wiki, pero decir que no es constructivo es injusto. –

+0

Estoy de acuerdo. Esto respondió la pregunta exacta que tuve. – Hades

+0

Hay ocasiones en que un desarrollador más nuevo tiene problemas para comprender las implicaciones de ciertas funciones del software que está utilizando. Las preguntas como esta son particularmente útiles para los nuevos desarrolladores, principalmente porque la discusión que sigue ilumina muchas posibilidades que el desarrollador junior nunca consideró. El formato de la pregunta es elemental, en el mejor de los casos, pero la intención parece ser honesta en el sentido de que pregunta "¿por qué existe esto?" Estoy de acuerdo con Wayne Koorts, es una pena que CasperOne eligió cerrar esto y lo llamó "no constructivo". La parte "no constructiva" particularmente me irrita. – Kaorie

Respuesta

71

Si usted tiene una "red" que desea llenar por completo, como el tamaño y el color de información para un artículo particular de ropa:

select 
    size, 
    color 
from 
    sizes CROSS JOIN colors 

Tal vez usted quiere una tabla que contiene una fila por cada minuto en el día, y desea utilizarlo para verificar que un procedimiento se ha ejecutado cada minuto, por lo que podría cruzar tres tablas:

select 
    hour, 
    minute 
from 
    hours CROSS JOIN minutes 

o si tiene un conjunto de especificaciones de informe estándar que desea aplicar a todos los meses en el año:

select 
    specId, 
    month 
from 
    reports CROSS JOIN months 

El problema con el mantenimiento de estas vistas es que, en la mayoría de los casos, no se desea un producto completo, especialmente con respecto a la ropa. Puede agregar la lógica MINUS a la consulta para eliminar ciertas combinaciones que no lleva, pero le puede resultar más fácil rellenar una tabla de otra manera y no usar un producto cartesiano.

Además, es posible que termine probando la combinación cruzada en tablas que tal vez tengan unas cuantas filas más de lo que pensaba, o tal vez su cláusula WHERE ha desaparecido parcial o completamente. En ese caso, su DBA le notificará de inmediato sobre la omisión. Por lo general, él o ella no serán felices.

+5

_... En ese caso, su DBA le notificará de inmediato sobre la omisión. Por lo general, él o ella no serán felices. ¡Jaja, tan cierto! – RSW

+2

@Dave: ¿No será el segundo ejemplo de hora CROSS JOIN minutos? – Rakesh

+0

@Rakesh, buena captura, estaba pensando en algo más de lo que estaba escribiendo. Fijo. –

12

Por lo general, no va a querer un producto cartesiano completo para la mayoría de las consultas de bases de datos. Todo el poder de las bases de datos relacionales es que puede aplicar las restricciones que le puedan interesar para evitar robar filas innecesarias de la base de datos.

Supongo que un ejemplo inventado en el que puede querer es si tiene una tabla de empleados y una tabla de trabajos que necesitan hacer y desea ver todas las asignaciones posibles de un empleado a un trabajo.

7

Generar datos para la prueba.

1

Imagine que tiene una serie de consultas que desea emitir sobre una combinación específica de elementos y fechas (precios, disponibilidad, etc.). Puede cargar los elementos y fechas en tablas temporales separadas y hacer que sus consultas se unan a las tablas. Esto puede ser más conveniente que la alternativa de enumerar los elementos y las fechas en las cláusulas IN, especialmente dado que algunas bases de datos limitan el número de elementos en una cláusula IN.

9

Ok, probablemente esto no responda la pregunta, pero si es verdad (y ni siquiera estoy seguro de eso) es un poco de historia.

En los primeros días de Oracle, uno de los desarrolladores se dio cuenta de que necesitaba duplicar cada fila en la tabla (es posible que fuera una tabla de eventos y necesitaba cambiarla como "evento de inicio" y "evento final") . Se dio cuenta de que si tuviera una mesa con solo dos filas, podría hacer una combinación cruzada, seleccionando solo las columnas de las dos primeras, y obtendría exactamente lo que necesitaba. Así que creó una tabla simple, que naturalmente llamó "DUAL".

Más tarde, tenía que hacer algo que solo se podía hacer seleccionando de una tabla, aunque la acción en sí no tenía nada que ver con la tabla (tal vez olvidó su reloj y quería leer la hora mediante SELECT SYSDATE FROM ...) Se dio cuenta de que todavía tenía su mesa DUAL por ahí, y lo usó. Después de un tiempo, se cansó de ver el tiempo impreso dos veces, por lo que eventualmente borró una de las filas.

Otros en Oracle comenzaron a usar su tabla, y finalmente se decidió incluirla en la instalación estándar de Oracle.

Lo que explica por qué una tabla cuyo único significado es que tiene una fila tiene un nombre que significa "dos".

3

Toma algo así como una tabla de dígitos, que tiene diez filas para los dígitos 0-9. Puede usar combinación cruzada en esa tabla varias veces para obtener un resultado que tenga tantas filas como necesite, con los resultados numerados apropiadamente. Esto tiene varios usos. Por ejemplo, puede combinarlo con una función datadd() para obtener un conjunto para cada día en un año determinado.

5

La clave es "muéstrame todas las combinaciones posibles". Los he usado junto con otros campos calculados y los he ordenado/filtrado.

Por ejemplo, supongamos que está creando una aplicación de arbitraje (trading). Tienes vendedores que ofrecen productos a un precio y compradores que piden productos a un costo. Realice una combinación cruzada en la clave del producto (para hacer coincidir los posibles compradores y vendedores), calcule la diferencia entre costo y precio, luego clasifique desc. en esto para darle a usted (el intermediario) los intercambios más rentables para ejecutar. Casi siempre tendrás otros criterios de filtro delimitador, por supuesto.

Cuestiones relacionadas