tipos tables outer left sql join

tables - tipos de join sql



¿Cuál es la diferencia entre "usar" y "activar" en la tabla se une a MysQL? (7)

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

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

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

Si, por otro lado, haces esto:

JOIN ... USING (common)

entonces el conjunto de resultados tendrá solo una columna llamada common , y será un nombre no calificado, ni t1.common ni t2.common estarán presentes.

Es esto

... 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 uniones?

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


Ahora para otra pregunta:

Es lo anterior lo mismo que

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

Esto no creo que sea 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?


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

En cuanto a la segunda pregunta, ambas consultas podrían ser iguales o 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.


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

A JOIN B USING (column1) A JOIN B ON A.column1=B.column1

También puede nombrar varias columnas, lo que hace que las uniones en las teclas compuestas sean bastante sencillas. Las siguientes uniones deben ser equivalentes:

A JOIN B USING (column1, column2) A JOIN B ON A.column1=B.column1 AND A.column2=B.column2

Tenga en cuenta que se necesita USING (<columnlist>) para tener paréntesis, mientras que ON <expr> no es necesario para tener paréntesis (aunque las parens se pueden utilizar alrededor de <expr> solo se pueden incluir alrededor de una expresión en cualquier otro contexto).

Además, ninguna otra tabla unida a 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 utilice una 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 .


No uso la sintaxis USING, ya que

  1. la mayoría de mis combinaciones no son adecuadas (no es el mismo nombre de campo que se está combinando, y / o múltiples coincidencias en la combinación) y
  2. no es inmediatamente obvio a qué se traduce en el caso con más de dos tablas

es decir, asumiendo 3 tablas con columnas ''id'' e ''id_2'', no

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

volverse

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 algo más otra vez?

Descubrir 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 (entonces el otras personas también tendrán que ser conscientes de lo que es equivalente).

Una diferencia obvia con WHERE vs ON es si la unión es externa:

Suponiendo un T1 con un solo campo de ID, una fila que contenga el valor 1 y una T2 con un campo de ID y VALOR (una fila, ID = 1, VALOR = 6), entonces obtenemos:

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

no da filas, ya que se requiere que DONDE coincida, 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 ON solo es necesario para hacer coincidir la unión, que es opcional por ser externa.


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.


Tu interpretación parece correcta. Este artículo puede ayudar.

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


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