2009-03-27 10 views
14

¿Hay alguna diferencia significativa entre las siguientes?SQL JOIN: ON vs Igual

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

Y

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

hacerlo los usuarios tienen una preferencia de uno sobre el otro?

Respuesta

21

No hay diferencia, pero la legibilidad de la segunda es mucho mejor cuando tiene una gran consulta de combinaciones múltiples con cláusulas extra para el filtrado.
La separación de las cláusulas y las cláusulas de filtro de combinación es una buena cosa :)

+1

No hay diferencia para esta consulta, pero para otras consultas hay algunas cosas que puede hacer con la sintaxis de estilo 'INNER JOIN' que no se puede hacer con la sintaxis de estilo a, b. –

+0

Joel: Muy cierto :) –

0

Sin diferencia. Encuentro que el primer formato es más legible y uso el segundo formato solo cuando hago otros tipos de uniones (EXTERIOR, IZQUIERDA INTERIOR, etc.).

8

El primero es ANSI 89 sintaxis, este último es ANSI 92.

Para que consulta específica no hay diferencia. Sin embargo, con el primero, se pierde la capacidad de separar un filtro de una condición de unión en consultas complejas, y la sintaxis para especificar LEFT vs RIGHT vs INNER suele ser confusa, especialmente si tiene que ir y venir entre diferentes proveedores de db. No me gusta la sintaxis antigua en absoluto.

0

El segundo formulario es la sintaxis compatible con SQL92. Esto debería significar que es compatible con todos los proveedores de bases de datos actuales y futuras. Sin embargo, la verdad es que la primera forma es tan generalizada que también se garantiza que estará presente por más tiempo del que nos importa.

De lo contrario, son iguales en todos los aspectos en cómo las bases de datos tratan a los dos.

3

No hay diferencia con el motor de consulta SQL.

Para legibilidad, este último es mucho más fácil de leer si usa saltos de línea y sangría.

Para INNER JOINs, no importa si coloca "filtros" y "uniones" en la cláusula ON o WHERE, el optimizador de consultas debe decidir primero qué hacer (puede optar primero por un filtro, unir más adelante, o viceversa

Para OUTER JOINs, sin embargo, hay una diferencia, y algunas veces querrás poner la condición en la cláusula ON, a veces en WHERE. Poner una condición en la cláusula WHERE para una OUTER JOIN puede volverse en un INNER JOIN (debido a cómo funcionan los nulos)

Por ejemplo, comprobar la legibilidad entre las dos muestras siguientes:

SELECT c.customer_no, o.order_no, a.article_no, r.price 
FROM customer c, order o, orderrow r, article a 
WHERE o.customer_id = c.customer_id 
AND r.order_id = o.order_id 
AND a.article_id = r.article_id 
AND o.orderdate >= '2003-01-01' 
AND o.orderdate < '2004-01-01' 
AND c.customer_name LIKE 'A%' 
ORDER BY r.price DESC 

vs

SELECT c.customer_no, o.order_no, a.article_no, r.price 
FROM customer c 
INNER JOIN order o 
    ON o.customer_id = c.customer_id 
    AND o.orderdate >= '2003-01-01' 
    AND o.orderdate < '2004-01-01' 
INNER JOIN orderrow r 
    ON r.order_id = o.order_id 
INNER JOIN article a 
    ON a.article_id = r.article_id 
WHERE c.customer_name LIKE 'A%' 
ORDER BY r.price DESC 
+0

Poner una condición en una cláusula where frente a una cláusula join ciertamente importa para las uniones externas. –

+0

¿Por qué se bajó este voto? Lo estoy votando de vuelta. Brimstedt simplemente estaba mostrando que la segunda versión es más fácil de leer (y estoy de acuerdo con él). Las uniones y los filtros son, conceptualmente, dos cosas diferentes. – Cybis

+0

ah, sí para las uniones externas hace la diferencia ... gracias por señalarlo, Ill edito mi respuesta para completar – Brimstedt

1

Mientras que usted puede realizar la mayoría de tareas por medio de ambos y en su caso no hay ninguna diferencia en absoluto, siempre voy a utilizar el segundo en todo momento.

  1. Es la corriente apoyado norma
  2. Mantiene combinaciones en la cláusula FROM y filtros en la cláusula WHERE
  3. Hace IZQUIERDA más complejo, DERECHA, FULL OUTER une mucho más fácil
  4. MSSQL Ayuda es todo en función de esa sintaxis, por lo tanto, es mucho más fácil obtener ayuda sobre sus consultas de problemas
1

Si bien no hay diferencia técnica, debe tener mucho cuidado al hacer combinaciones utilizando el primer método. Si lo hace mal por accidente, podría terminar haciendo una unión cartesiana entre sus tablas ayb (una consulta muy larga, memoria & cpu intensive - coincidirá con cada fila en a con todas las filas en b. Bad si a yb son tablas grandes para comenzar). El uso de un INNER JOIN explícito es más seguro y fácil de leer.