2008-12-16 18 views
10

¿Es esta¿Cuál es la diferencia entre "usar" y "activar" en la tabla se une en MysQL?

... T1 join T2 using(ID) where T2.VALUE=42 ... 

lo mismo que

... T1 join T2 on(T1.ID=T2.ID) where T2.VALUE=42 ... 

para todos los tipos de combinaciones?

Mi comprensión de using(ID) es que es solo abreviatura de on(T1.ID=T2.ID). ¿Es esto cierto?


ya por otra pregunta:

¿Es lo anterior, el mismo que

... T1 join T2 on(T1.ID=T2.ID and T2.VALUE=42) ... 

Esto no creo que es cierto, pero ¿por qué? ¿Cómo interactúan las condiciones en la cláusula on con la unión vs si está en la cláusula where?

+0

¿Por qué interés qué base de datos estás utilizando? Acabo de probar la sintaxis de USING en SQL Server y parece que no funciona. –

+0

Estoy usando MySQL – Pyrolistical

Respuesta

12

que no utilizan la sintaxis USO, ya

  1. mayor parte de mi combinaciones que no se adaptan a ella (no es el mismo nombre de campo que se está igualada, y/o varias coincidencias en la unión) y
  2. no es inmediatamente evidente lo que se traduce en el caso de más de dos tablas

es decir, suponiendo 3 mesas con 'id' y 'columnas' ID_2, hace

T1 JOIN T2 USING(id) JOIN T3 USING(id_2) 

convierten

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2) 

o

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2) 

o alguna otra cosa de nuevo?

Encontrar esto para una versión de base de datos en particular es un ejercicio bastante trivial, pero no tengo una gran cantidad de confianza de que sea consistente en todas las bases de datos, y no soy la única persona que tiene que mantener mi código (para que las demás personas también tengan que saber a qué equivale).

Una diferencia obvia con el DONDE vs ON es si la unión es exterior:

Suponiendo un T1 con un campo de ID único, una fila que contiene el valor 1, y una T2 con un ID y el campo de valor (uno fila, ID = 1, VALUE = 6), entonces se obtiene:

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42 

da ninguna fila, ya que se requiere la DONDE a la altura, mientras que

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42) 

dará una fila con los valores

1, NULL, NULL 

ya que el ENCENDIDO solo es necesario para hacer coincidir la unión, que es opcional por ser exterior.

1

Tu interpretación parece correcta. This article puede ayudar.

En cuanto a la segunda pregunta, no puedo ver por qué el resultado de su tercer ejemplo debe ser diferente del de los dos primeros. Cualquier condición en una cláusula 'ON' tiene el mismo significado que si estuviera en una cláusula 'WHERE'.

+1

No, dependiendo de las condiciones de tipo de combinación en la cláusula ON puede tener un significado muy diferente al de la cláusula where. –

+0

¿No es la única palabra 'join', como en los ejemplos, un sinónimo de 'inner join'? –

1

Creo que está en lo correcto: USAR (xx) es abreviar para unir dos columnas con nombres idénticos.

En cuanto a la segunda pregunta, ambas consultas podrían ser iguales o pueden ser diferentes dependiendo de la implementación del planificador de consultas específico de la base de datos. Para averiguarlo por sí mismo (al menos en postgres) haga una EXPLICACIÓN SELECCIONADA ... para ver cómo se ejecutarán los planes de consulta.

1

Si solo hay una unión, entonces no hay diferencia.

La desventaja de la cláusula de uso es que ambas tablas deben tener el mismo nombre de columna.

5

La cláusula USING es la abreviatura de una combinación de igualdad de columnas, suponiendo que existan las columnas de ambas tablas con el mismo nombre:

A JOIN B USING (column1) 

A JOIN B ON A.column1=B.column1 

También puede nombrar múltiples columnas, lo que hace que se une en las claves compuestas bonitas sencillo. A continuación se une debe ser equivalente:

A JOIN B USING (column1, column2) 

A JOIN B ON A.column1=B.column1 AND A.column2=B.column2 

cuenta que se requiere USING (<columnlist>) tener paréntesis, mientras que ON <expr> no está obligado a tener paréntesis (aunque parens pueden ser utilizados alrededor de <expr> solo pueden incluirse en torno a una expresión en cualquier otra contexto).

Además, ninguna otra tabla unida en la consulta puede tener una columna con ese nombre, de lo contrario, la consulta es ambigua y debería obtener un error.

En cuanto a su pregunta sobre condiciones adicionales, suponiendo que use un INNER JOIN lógicamente debería dar el mismo resultado de la consulta, pero el plan de optimización puede verse afectado, dependiendo de la implementación de RDBMS. También OUTER JOIN da un resultado diferente si incluye condiciones en la cláusula join versus WHERE.

+0

Entonces, ¿cree que ON es un elemento beneficioso o una característica del idioma? – dkretz

+0

Por supuesto. Necesita ON cuando tiene una expresión de combinación distinta de dos columnas iguales. Prefiero usar la sintaxis SQL-92 en lugar de poner condiciones de unión en la cláusula WHERE. –

0

Aquí tienes las respuestas, no necesito añadir nada. Una vez que hice una prueba de rendimiento en esto, y el uso consistentemente y siempre corrí más rápido que ON. Sí, estoy hablando de 10 a 20 ms :) MySQL Estoy hablando de

0

Hay una diferencia en el resultado que no veo mencionado en las otras respuestas. Si hace esto:

JOIN ... ON t1.common = t2.common 

entonces el conjunto de resultados tendrá dos columnas llamadas common, específicamente t1.common y t2.common, y el nombre no calificado no va a funcionar en la consulta porque es ambigua.

Si, por el contrario, hacer esto:

JOIN ... USING (common) 

entonces el conjunto de resultados sólo tienen una columna llamada common, y será un nombre no calificado - ni t1.common ni t2.common estará presente.

Cuestiones relacionadas