Diferencia entre la unión izquierda y la unión derecha en SQL Server

225

Sé acerca de las uniones en SQL Server.

Por ejemplo. Hay dos tablas Tabla1, Tabla2.

Sus estructuras de tabla son las siguientes.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Tabla1 datos de la siguiente manera:

    Id     Name     
    -------------
    1      A        
    2      B    

Tabla2 datos de la siguiente manera:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Si ejecuto las dos instrucciones SQL mencionadas a continuación, ambas salidas serán las mismas

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Explique la diferencia entre la unión izquierda y derecha en las declaraciones SQL anteriores.

Pankaj Agarwal
fuente

Respuestas:

73
Select * from Table1 left join Table2 ...

y

Select * from Table2 right join Table1 ...

son de hecho completamente intercambiables. Sin embargo, intente Table2 left join Table1(o su par idéntico Table1 right join Table2) para ver la diferencia. Esta consulta debería proporcionarle más filas, ya que la Tabla2 contiene una fila con una identificación que no está presente en la Tabla1.

Péter Török
fuente
17
Entonces, ¿por qué necesitamos RIGHT JOINsi podemos lograr cualquier resultado deseado con solo LEFT JOIN? : P
user1857492
1
@SilapAliyev Esa es realmente una muy buena pregunta. ¿Alguien puede responder? : D
Ian Chu Te
21
Select * from Table1 left join Table 2devolverá TODOS los registros de la tabla 1 más los registros coincidentes de la Tabla 2. Lo contrario Select * from Table1 right join Table 2devolvería TODOS los registros de la Tabla 2 y los registros coincidentes de la Tabla 1. Espero que ayude.
Programador Adagal
3
si usa más de 2 tablas, usar la combinación correcta puede ser significativo y legible
ɥʇɹɐʞıɥʇɹɐʞ ouɐɯ
1
@MarkusMeskanen estás cambiando una oración simple de 7 palabras. Cuando tenga una oración de 356 líneas con múltiples subsecuencias y necesite cambiar la lógica de Izquierda Derecha, se preguntará si la cambia con una sola palabra ...
Programador Adagal
1014

Codeproject tiene esta imagen que explica los conceptos básicos simples de las uniones SQL, tomadas de: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL une explicado

Daan Timmer
fuente
64
No hay mucho "detalle" allí. El crédito debería ir a la página del proyecto de código en lugar de a mí. Pero, por supuesto, no me importa la atención :-)
Daan Timmer
66
@Daan Timmer no, ¡también debe haber crédito para ti! Vuelva a empaquetar y revender para satisfacer una demanda específica y particular. Los minoristas hacen lo mismo y obtienen $$ miles de millones
BKSpurgeon
Siento que podemos requerir la condición "AND" en la cláusula where de la última figura de "Outer Excluyendo JOIN". Siento que la consulta debe actualizarse para SELECCIONAR <seleccionar_lista> DESDE la Tabla_A A EXTERIOR COMPLETO UNIRSE a la Tabla_B B EN A.Key = B.Key DONDE A.Key ES NULL Y B.Key IS NULL
vinsinraw
@vinsinraw que no es necesario. Debido a que ya está cubierta por la condición: JOIN Table_B b ON A.Key = B.Key. La condición OR funciona bien.
Daan Timmer
Este es un abuso común de los diagramas de Venn. Los círculos A y B no representan las tablas A y B, el círculo A es A IZQUIERDA B & cirlce B es A DERECHA UNIR B. Además, no importa cuál sea la condición ON y las teclas son irrelevantes y WHEREs no funcionan todos caso. Vea mis comentarios y respuestas en esta página y en esta sección Diagramas de Re Venn .
philipxy
37

La tabla de la que está tomando datos es 'IZQUIERDA'.
La tabla a la que se está uniendo es 'DERECHA'.
IZQUIERDA: Tome todos los elementos de la tabla izquierda Y (solo) elementos coincidentes de la tabla derecha.
UNIÓN DERECHA: Tome todos los elementos de la tabla derecha Y (solo) elementos coincidentes de la tabla izquierda.
Entonces:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

da:

Id     Name       
-------------  
1      A          
2      B      

pero:

Select * from Table1 right join Table2 on Table1.id = Table2.id

da:

Id     Name       
-------------  
1      A          
2      B   
3      C  

tenías derecho a unirte a la mesa con menos filas en la mesa con más filas
Y
nuevamente, a la izquierda unir la mesa con menos filas en la mesa con más filas
Prueba:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  
vbole
fuente
22

(INTERIOR) JOIN: Devuelve registros que tienen valores coincidentes en ambas tablas.

IZQUIERDA (EXTERIOR): devuelve todos los registros de la tabla izquierda y los registros coincidentes de la tabla derecha.

UNIÓN DERECHA (EXTERIOR): devuelve todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda.

FULL (OUTER) JOIN: devuelve todos los registros cuando hay una coincidencia en la tabla izquierda o derecha

Por ejemplo, supongamos que tenemos dos tablas con los siguientes registros:

Tabla A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tabla B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Unir internamente

Nota: Da la intersección de dos tablas.

Unir internamente

Sintaxis

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Aplíquelo en su tabla de muestra:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

El resultado será:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Izquierda unirse

Nota: dará todas las filas seleccionadas en la Tabla A, más cualquier fila seleccionada común en la Tabla B.

Izquierda unirse

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Aplícalo en tu tabla de muestra

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

El resultado será:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Únete a la derecha

Nota: dará todas las filas seleccionadas en TableB, más cualquier fila seleccionada común en TableA.

Únete a la derecha

Sintaxis:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Aplícalo en tu tabla samole:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

El resultado será:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Únete completo

Nota: Es lo mismo que la operación de unión, devolverá todos los valores seleccionados de ambas tablas.

Unión completa

Sintaxis:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Aplíquelo en su muestra [tabla de archivos:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

El resultado será:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Algunos hechos

Para INNER se une, el orden no importa

Para las uniones EXTERIORES (IZQUIERDA, DERECHA o COMPLETA), el orden importa

Encuentre más en w3schools

Sushank Pokharel
fuente
12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

La tabla en fromeste ejemplo tableA, está en el lado izquierdo de la relación.

tableA <- tableB
[left]------[right]

Entonces, si desea tomar todas las filas de la tabla izquierda ( tableA), incluso si no hay coincidencias en la tabla derecha ( tableB), usará la "combinación izquierda".

Y si desea tomar todas las filas de la tabla derecha ( tableB), incluso si no hay coincidencias en la tabla izquierda ( tableA), utilizará el right join.

Por lo tanto, la siguiente consulta es equivalente a la utilizada anteriormente.

select fields
from tableB 
right join tableA on tableB.key = tableA.key
Moraes
fuente
10

Parece que se pregunta: "Si puedo reescribir una sintaxis de RIGHT OUTER JOINuso LEFT OUTER JOIN, ¿por qué tener una RIGHT OUTER JOINsintaxis?" Creo que la respuesta a esta pregunta es, porque los diseñadores del lenguaje no querían imponer una restricción a los usuarios (y creo que habrían sido criticados si lo hicieran), lo que obligaría a los usuarios a cambiar el orden de las tablas. en la FROMcláusula en algunas circunstancias cuando simplemente se cambia el tipo de unión.

un día cuando
fuente
a veces las uniones externas izquierda y derecha son completamente intercambiables, ¿correcto?
ア レ ッ ク ス
44
@Alex: de hecho, las uniones externas izquierda y derecha son siempre intercambiables.
cuando el
8

Sus dos declaraciones son equivalentes.

La mayoría de las personas solo usan, LEFT JOINya que parece más intuitivo, y es una sintaxis universal: no creo que todos los RDBMS sean compatibles RIGHT JOIN.

JNK
fuente
"No creo que todos los RDBMS admitan RIGHT JOIN", claro, no todos los RDBMS admiten SQL. Pero si está insinuando que algunos productos SQL son compatibles LEFTpero no RIGHT, indique cuáles.
cuando el
10
@onedaywhen Por ejemplo, SQLite 3 no se implementa RIGHTy FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13
0

Siento que podemos requerir ANDcondición en la wherecláusula de la última figura de Outer Excluding JOINpara que podamos obtener el resultado deseado A Union B Minus A Interaction B. Siento que la consulta debe actualizarse a

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Si usamos OR, obtendremos todos los resultados deA Union B

vinsinraw
fuente
0

seleccione * de la Tabla1 a la izquierda, únase a la Tabla2 en la Tabla1.id = Tabla2.id

En la primera consulta, la unión izquierda compara la tabla del lado izquierdo table1 con la tabla del lado derecho table2 .

En el que todas las propiedades de la Tabla 1 se muestran, mientras que en tabla2 sólo aquellas propiedades se mostrarán en qué condición conseguir cierto.

seleccione * de Table2 unir a la derecha Table1 en Table1.id = Table2.id

En la primera consulta, la unión derecha compara la tabla del lado derecho table1 con la tabla del lado izquierdo table2 .

En el que todas las propiedades de la Tabla 1 se muestran, mientras que en tabla2 sólo aquellas propiedades se mostrarán en qué condición conseguir cierto.

Ambas consultas darán el mismo resultado porque el orden de la declaración de la tabla en la consulta es diferente, ya que declara table1 y table2 en la izquierda y la derecha respectivamente en la primera consulta de combinación izquierda , y también declara table1 y table2 en la derecha y la izquierda respectivamente en la segunda combinación derecha consulta.

Esta es la razón por la que obtiene el mismo resultado en ambas consultas. Entonces, si desea un resultado diferente, ejecute estas dos consultas respectivamente,

seleccione * de la Tabla1 a la izquierda, únase a la Tabla2 en la Tabla1.id = Tabla2.id

seleccione * desde la Tabla1 y únase a la Tabla2 en Table1.id = Table2.id

Nisarg Shah
fuente
0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Por definición: Left Join selecciona todas las columnas mencionadas con la palabra clave "select" de la Tabla 1 y las columnas de la Tabla 2 que coinciden con los criterios después de la palabra clave "on".

Del mismo modo, por definición: la unión derecha selecciona todas las columnas mencionadas con la palabra clave "select" de la tabla 2 y las columnas de la tabla 1 que coincide con los criterios después de la palabra clave "on".

Refiriéndose a su pregunta, las identificaciones en ambas tablas se comparan con todas las columnas necesarias para arrojarse en la salida. Por lo tanto, los identificadores 1 y 2 son comunes en ambas tablas y, como resultado, tendrá cuatro columnas con columnas de identificación y nombre de las tablas primera y segunda en orden.

*select * from Table1 left join Table2 on Table1.id = Table2.id

La expresión anterior, toma todos los registros (filas) de la tabla 1 y las columnas, con las identificaciones coincidentes de la tabla 1 y la tabla 2, de la tabla 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

De manera similar, a partir de la expresión anterior, toma todos los registros (filas) de la tabla 1 y las columnas, con las identificaciones coincidentes de la tabla 1 y la tabla 2, de la tabla 2. (recuerde, esta es una unión correcta, por lo que todas las columnas de la tabla2 y no de la tabla 1 se considerará).

VDWWD
fuente