stuff - Diferencia entre unir a la izquierda y unir a la derecha en SQL Server
sql server substring left (10)
Sé acerca de las uniones en SQL Server.
Por ejemplo. hay dos tablas Table1, Table2.
Allí están siguiendo la estructura de la mesa.
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
Tabla 2 Datos de la siguiente manera:
Id Name
-------------
1 A
2 B
3 C
Si ejecuto las dos sentencias de 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
Por favor, explique la diferencia entre la izquierda y la derecha en las declaraciones de SQL anteriores.
Codeproject tiene esta imagen que explica los conceptos básicos simples de las combinaciones SQL, tomadas de: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
Creo que podemos exigir AND
condicionar en where
cláusula de la última cifra de Outer Excluding JOIN
para que obtengamos el resultado deseado de A Union B Minus A Interaction B
Siento que la consulta necesita actualizarse para
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 de A Union B
La tabla de la que está tomando los datos es ''IZQUIERDA''.
La tabla a la que se une es ''DERECHA''
ÚNASE A LA IZQUIERDA: tome todos los elementos de la tabla izquierda Y (solo) los elementos coincidentes de la tabla derecha.
ÚNASE A LA DERECHA: tome todos los elementos de la tabla derecha Y (solo) los elementos coincidentes de la tabla izquierda.
Asi que:
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 razón al unirte a la tabla con menos filas en la tabla con más filas
Y
de nuevo, uniéndose a la tabla con menos filas en la tabla con más filas
Tratar:
If Table1.Rows.Count > Table2.Rows.Count Then
'' Left Join
Else
'' Right Join
End If
Parece que estás preguntando: "Si puedo reescribir una RIGHT OUTER JOIN
utilizando la sintaxis de LEFT OUTER JOIN
, ¿por qué tener una sintaxis de RIGHT OUTER JOIN
?" Creo que la respuesta a esta pregunta es, porque los diseñadores del lenguaje no querían poner tal restricción en los usuarios (y creo que hubieran sido criticados si lo hicieran), lo que obligaría a los usuarios a cambiar el orden de las tablas. en la cláusula FROM
en algunas circunstancias cuando simplemente se cambia el tipo de unión.
Tus dos afirmaciones son equivalentes.
La mayoría de las personas solo usan LEFT JOIN
ya que parece más intuitiva, y su sintaxis es universal. No creo que todos los RDBMS sean compatibles con JUNTA RIGHT JOIN
.
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 "on" palabra clave.
De manera similar, Por definición: la combinación correcta selecciona todas las columnas mencionadas con la palabra clave "seleccionar" de la Tabla 2 y las columnas de la Tabla 1 que coinciden con los criterios después de la palabra clave "en".
Refiriéndose a su pregunta, las identificaciones en ambas tablas se comparan con todas las columnas necesarias para ser lanzadas en la salida. Por lo tanto, los identificadores 1 y 2 son comunes tanto en las tablas como en el resultado, tendrá cuatro columnas con las columnas id y name de la primera y la segunda tabla en orden.
*select * from Table1 left join Table2 on Table1.id = Table2.id
En la expresión anterior, toma todos los registros (filas) de la tabla 1 y las columnas, con los id correspondientes a 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 la expresión anterior, toma todos los registros (filas) de la tabla 1 y las columnas, con los identificadores coincidentes de la tabla 1 y la tabla 2, de la tabla 2. (recuerde, esta es una combinación correcta, por lo que todas las columnas de la tabla 2 y no de la tabla 1 será considerado).
(INNER) JOIN: devuelve registros que tienen valores coincidentes en ambas tablas.
LEFT (OUTER) JOIN: Devuelve todos los registros de la tabla de la izquierda y los registros coincidentes de la tabla de la derecha.
JUNTA DERECHA (EXTERIOR): devuelve todos los registros de la tabla derecha y los registros coincidentes de la tabla izquierda.
UNIR COMPLETO (EXTERIOR): 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.
Sintaxis
SELECT column_name FROM table1 INNER 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 INNER JOIN TableB ON TableA.id = TableB.id2;
El resultado será:
firstName lastName Place
_____________________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
Unirse a la izquierda
Nota: proporcionará todas las filas seleccionadas en la Tabla A, más cualquier fila seleccionada común en la TablaB.
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
Aplícalo en tu tabla de muestras.
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
Unirse a la derecha
Nota: proporcionará todas las filas seleccionadas en TableB, más cualquier fila seleccionada común en TableA.
Sintaxis:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
Aplícalo en tu mesa 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
Unirse completo
Nota: es igual que la operación de unión, devolverá todos los valores seleccionados de ambas tablas.
Sintaxis:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Aplícalo en tu samp [tabla le:
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 pedido no importa.
Para las combinaciones EXTERNAS (IZQUIERDA, DERECHA o COMPLETA), el orden es importante
Encuentre más en w3schools
seleccione * de Table1 left join table2 en Table1.id = Table2.id
En la primera consulta, la combinación izquierda compara la tabla de la tabla del lado izquierdo1 con la tabla de la tabla del lado derecho2 .
En el que se mostrarán todas las propiedades de table1 , mientras que en la tabla 2 solo se mostrarán aquellas propiedades en las que la condición sea verdadera.
seleccione * de Table2 right join Table1 en Table1.id = Table2.id
En la primera consulta, la combinación derecha compara la tabla de la derecha 1 con la tabla de la izquierda 2 .
En el que se mostrarán todas las propiedades de table1 , mientras que en la tabla 2 solo se mostrarán aquellas propiedades en las que la condición sea verdadera.
Ambas consultas darán el mismo resultado porque el orden de la declaración de la tabla en la consulta es diferente, ya que está declarando table1 y table2 en la izquierda y la derecha respectivamente en la primera consulta a la izquierda , y también declarando table1 y table2 en la derecha y la izquierda respectivamente en la segunda unión a la derecha consulta.
Esta es la razón por la que obtiene el mismo resultado en ambas consultas. Así que si quieres un resultado diferente, ejecuta estas dos consultas respectivamente,
seleccione * de Table1 left join table2 en Table1.id = Table2.id
seleccione * de Table1 right join Table2 en Table1.id = Table2.id
Select * from Table1 left join Table2 ...
y
Select * from Table2 right join Table1 ...
De hecho son completamente intercambiables. Sin embargo, intente Table2 left join Table1
(o su par idéntico, Table1 right join Table2
) para ver una diferencia. Esta consulta debería proporcionarle más filas, ya que Table2 contiene una fila con un ID que no está presente en Table1.
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
La tabla en la tabla from
este 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 de la izquierda (tabla tableA
), incluso si no hay coincidencias en la tabla de la derecha (tabla tableB
), usará la "combinación de la izquierda".
Y si desea tomar todas las filas de la tabla derecha (tabla tableB
), incluso si no hay coincidencias en la tabla izquierda (tabla tableA
), usará la 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