2008-12-27 24 views
25

los dos bits de SQL a continuación obtener el mismo resultadoSQL combinación interna sintaxis

SELECT c.name, o.product 
FROM customer c, order o 
WHERE c.id = o.cust_id 
AND o.value = 150 

SELECT c.name, o.product 
FROM customer c 
INNER JOIN order o on c.id = o.cust_id 
WHERE o.value = 150 

que he visto ambos estilos utilizados como estándar en diferentes empresas. Por lo que he visto, el segundo es lo que la mayoría de la gente recomienda en línea. ¿Hay alguna razón real para esto aparte del estilo? ¿El uso de una unión interna a veces tiene un mejor rendimiento?

He notado que los desarrolladores de Ingres y Oracle tienden a usar el primer estilo, mientras que los usuarios de Microsoft SQL Server han tendido a usar el segundo, pero eso podría ser solo una coincidencia.

Gracias por cualquier idea, me he preguntado sobre esto por un tiempo.

Editar: He cambiado el título de 'SQL Inner Join versus Cartesian Product' ya que estaba usando el terminlogy incorrecto. Gracias por todas las respuestas hasta ahora.

Respuesta

25

Ambas consultas son uniones internas y equivalentes. El primero es el método más antiguo de hacer las cosas, mientras que el uso de la sintaxis JOIN solo se hizo común después de la introducción del estándar SQL-92 (creo que está en las definiciones anteriores, simplemente no fue particularmente utilizado antes).

El uso de la sintaxis JOIN es muy recomendable ya que separa la lógica de unión de la lógica de filtrado en la cláusula WHERE. Mientras que la sintaxis JOIN es realmente azúcar sintáctica para las uniones internas, su fuerza reside en las uniones externas donde la sintaxis old * puede producir situaciones en las que es imposible describir inequívocamente la unión y la interpretación depende de la implementación. El [IZQUIERDA | DERECHA] La sintaxis JOIN evita estas dificultades y, por lo tanto, para mantener la coherencia, es preferible utilizar la cláusula JOIN en todas las circunstancias.

Tenga en cuenta que ninguno de estos dos ejemplos son productos cartesianos.Para eso tendrá que utilizar ya sea

SELECT c.name, o.product 
FROM customer c, order o 
WHERE o.value = 150 

o

SELECT c.name, o.product 
FROM customer c CROSS JOIN order o 
WHERE o.value = 150 
+1

La notación JOIN se introdujo en SQL-92; no llegó a ser frecuente hasta mucho más tarde. –

+0

Gracias por la corrección, revisé para ver si podía encontrar la fecha. Personalmente, realmente solo me convertí al uso de JOINS alrededor de 2001 o 2; el uso me pareció un poco extraño al principio, pero lo prefiero mucho ahora. – Cruachan

3

Ambas consultas están realizando una combinación interna, solo una sintaxis diferente.

4

Actualmente, estos ejemplos son equivalentes y ninguno de los dos es un producto cartesiano. Un producto cartesiano es devuelto cuando se une a dos tablas sin especificar una condición de unión, como en

select * 
from t1,t2 

Hay una buena discusión sobre esto en Wikipedia.

6

Para responder a una parte de su pregunta, creo que los primeros errores en la sintaxis JOIN ... ON en Oracle desalentaron a los usuarios de Oracle de esa sintaxis. No creo que haya ningún problema en particular ahora.

Son equivalentes y se deben analizar en la misma representación interna para la optimización.

+0

Algunos de los errores en la sintaxis de ANSI JOIN no son lo que yo llamaría "temprano". En un trabajo anterior donde hicimos muchas consultas enormes, encontramos un límite estricto en la cantidad total de columnas que podría tener en una consulta si usaba la sintaxis ANSI JOIN. Descubrirá que al menos tan tarde como en la versión de 10g aún había problemas. –

+0

Sí, todavía no uso uniones ANSI. –

4

Oracle tardó en admitir la sintaxis JOIN ... ON (ANSI) (no hasta Oracle 9), es por eso que los desarrolladores de Oracle a menudo no la usan.

Personalmente, prefiero utilizar la sintaxis ANSI cuando está lógicamente claro que una tabla dirige la consulta y las otras son tablas de búsqueda. Cuando las tablas son "iguales", tiendo a usar la sintaxis cartesiana.

El rendimiento no debe diferir en absoluto.

3

la unión ... EN ... sintaxis es una adición más reciente a las especificaciones ANSI e ISO para SQL. La sintaxis JOIN ... ON ... generalmente se prefiere porque 1) mueve los criterios de unión fuera de la cláusula WHERE haciendo que la cláusula WHERE solo sea filtrada y 2) la hace más obvia si está creando un temido producto cartesiano ya que cada uno JOIN debe ir acompañado de al menos una cláusula ON. Si todos los criterios de unión están simplemente en Y en la cláusula WHERE, no es tan obvio cuando faltan uno o más.

Cuestiones relacionadas