2011-04-21 15 views
23

Me pregunto si CROSS JOIN se puede reemplazar de forma segura con INNER JOIN en cualquier consulta cuando se encuentre.¿CROSS JOIN es un sinónimo de INNER JOIN sin la cláusula ON?

¿Es INNER JOIN sin ON o USING exactamente lo mismo que CROSS JOIN? En caso afirmativo, ¿se ha inventado el tipo CROSS JOIN solo para expresar mejor la intención en una consulta?

Un apéndice a esta pregunta sería:

¿Puede haber una diferencia usando moderna y DBMSes ampliamente utilizado cuando se usa CROSS JOIN ... WHERE x, INNER JOIN ... ON (x) o INNER JOIN ... WHERE (x)?

Gracias.

Respuesta

20

En todas las bases de datos modernas, todas estas construcciones están optimizadas para el mismo plan.

Algunas bases de datos (como SQL Server) requieren una condición ON después del INNER JOIN, por lo que su tercera consulta simplemente no se analizará allí.

alcance Visibilidad de las tablas es del orden JOIN, por lo que esta consulta:

SELECT * 
FROM s1 
JOIN s2 
ON  s1.id IN (s2.id, s3.id) 
CROSS JOIN 
     s3 

no va a analizar, mientras éste:

SELECT * 
FROM s2 
CROSS JOIN 
     s3 
JOIN s1 
ON  s1.id IN (s2.id, s3.id) 

voluntad.

+0

Gracias por la respuesta. ¿La condición 'ON' es obligatoria de acuerdo con el estándar para' INNER JOIN's? – Benoit

+0

@Benoit: de acuerdo con 'SQL-92', no lo es. Sin embargo, no tengo una copia de '2003' o' 2008' a mano. Todas las bases de datos excepto 'MySQL' lo requieren. – Quassnoi

+0

@Quassnoi: SQLite no. – Benoit

2

Una combinación cruzada bruta es aquella que no tiene una cláusula where, lo que significa que se produce un registro para cada combinación de las tablas izquierda y derecha unidas con nulos insertados donde no hay datos del lado izquierdo o derecho.

Si agrega una cláusula where a una unión cruzada, esto lo hace equivalente a una unión interna, ya que la cláusula where hace lo mismo que la ON de la unión interna.

Sin embargo, las uniones internas son generalmente más agradables de usar ya que esto separa la condición de encendido del resto de las cláusulas where, lo que facilita su comprensión.

+3

En su primer párrafo, confunde las uniones CROSS y OUTER. La unión cruzada con una tabla vacía emite un resultado vacío. – Benoit