Razón para preferir DERECHA UNIR a IZQUIERDA

18

Si entiendo correctamente, cada RIGHT JOIN:

SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

se puede expresar como LEFT JOIN:

SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID

Mi opinión personal es que la intención de la declaración:

  • Primero consigue el Persons
  • Luego expanda / repita Personssegún sea necesario para que coincida con elOrders

se expresa mejor por el orden de Persons LEFT JOIN Ordersque por el orden inverso Orders RIGHT JOIN Persons(y nunca uso RIGHT JOINcomo resultado).

¿Hay alguna situación en la que RIGHT JOINse prefiera a? ¿O hay casos de uso en los que se RIGHT JOINpuede hacer algo que LEFT JOINno se puede hacer?

Zev Spitz
fuente
12
No recuerdo un caso en el que quisiera unirme correctamente. He tenido casos en los que el plan de ejecución de una consulta invirtió una combinación izquierda en una combinación derecha por razones de rendimiento. Pero desde un punto de vista de escritura de código puro, no, no recuerdo haber escrito nunca una combinación correcta.
Brandon
2
No veo esto como una pregunta sobre "explicar, escribir o depurar código". Se pregunta por qué un lenguaje tiene dos características que aparentemente hacen lo mismo, si en realidad hay alguna diferencia entre ellas y, de no ser así, cuándo sería preferible la "no obvia".
Philip Kendall
1
No, una unión izquierda casi siempre captura lo que necesita de manera más sucinta y es más fácil razonar. En mi lugar de trabajo, en realidad tenemos un estándar para evitar uniones correctas, ya que nunca hay un caso en el que sean necesarias (es decir, siempre se pueden reemplazar por la unión izquierda opuesta).
mgw854
8
He restablecido los votos cerrados: esta pregunta es sobre el tema aquí, ya que comprender la diferencia entre las uniones afecta el diseño del software (el diseño de la base de datos es parte del diseño del software, al igual que los algoritmos que pueden consultar bases de datos). También puede estar en el tema en Administradores de bases de datos , y también puede haber un duplicado allí.
Thomas Owens
1
No estoy seguro si está sugiriendo que RIGHT JOINse recomienda o es más común. Si esa es su premisa, es incorrecta. No puedo pensar en una vez que haya visto la combinación correcta utilizada en código ni en ejemplos. Es JOINo LEFT OUTER JOIN. En casos raros, puede ver a FULL OUTER JOIN.
JimmyJames

Respuestas:

12

Eso depende de qué requisito esté tratando de cumplir.

No es lo mismo decir: "dame a todas las personas y sus órdenes correspondientes" que "quiero todas las órdenes con sus personas correspondientes" , especialmente si vas a usar is nullpara traer filas sin correspondencia correspondiente. Eso es lo que yo llamo la "tabla dominante", que es la tabla de la que quiero obtener filas, independientemente de que no haya una fila correspondiente en el otro lado de la unión.

Mira estas imágenes y notarás que no son lo mismo:

ingrese la descripción de la imagen aquí

La fuente de la imagen es este excelente artículo .

Pero tiene razón en que ambos requisitos se pueden cumplir con cualquier combinación simplemente invirtiendo el orden de las tablas en la combinación.

Pero supongo que para las personas occidentales acostumbradas a escribir de izquierda a derecha, es más natural usar combinaciones de izquierda sobre combinaciones de derecha , ya que vemos que queremos que las combinaciones estén en la misma dirección o en el mismo orden que las selectcolumnas ed.

Entonces, una posible razón para preferir una unión correcta es porque en su cultura escribe de derecha a izquierda (como en los sistemas de escritura árabe o hebreo) y tiende a pensar de esa manera, lo que significa que tal vez en su cerebro la información textual fluya de derecha a izquierda .

Algunos lingüistas piensan que su idioma influye en su forma de pensar: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think

Tulains Córdova
fuente
1
Había empezado a pensar en este sentido, pero no creo que sea correcto. Empecé a imaginar escribir SQL en hebreo (lo que nunca he hecho realmente). OK: justificado a la derecha, de derecha a izquierda, de arriba abajo. Todavía mencionará la tabla A primero y luego la tabla B. Con una unión derecha, luego excluirá (especialmente en el caso nulo) la mayoría o la totalidad de la tabla mencionada primero. Creo que la mente humana tiende a asociarse primero con lo primario y lo más importante . Esto ocurre independientemente de la dirección de escritura. Podrías llamarlos "FIRST JOIN" y "SECOND JOIN" y este sesgo aún ocurriría.
Mike apoya a Monica el
He incluido un enlace a la imagen que ha mostrado a continuación.
Jon Raynor
@ Mike No estoy sugiriendo que la gente escriba SQL en árabe o hebreo. Solo que tal vez la orientación de su lengua materna podría ser una razón para que prefiera las uniones correctas. Pero eso es solo una posibilidad. Encuentro que la izquierda se une más natural.
Tulains Córdova
Ahora le di el debido crédito al creador de la imagen. Lo he tenido durante años en mi HD y no recordaba de dónde vino,
Tulains Córdova
Soy fluido en hebreo y todavía encuentro LEFT JOINmás natural.
Zev Spitz
3

No hay nada (que yo sepa) que se pueda hacer con una unión derecha que no se pueda hacer con una unión izquierda. Pero a veces la sintaxis con combinaciones izquierdas es más fea. Digamos que tiene las siguientes tablas:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

Supongamos que necesita obtener una lista de todas las personas en su base de datos y cualquier pedido que tengan con detalles especiales de pedido (diremos que no todos los pedidos tienen detalles especiales de pedido). Por lo tanto, normalmente haría una unión izquierda de personas a pedidos. Pero luego debes unirte en detalles de pedidos especiales. Si usa una unión interna allí, la unión de la izquierda de las personas a las órdenes se convertirá efectivamente en una unión interna. IE: esto es lo que quieres hacer pero no funciona (excluirá a cualquiera que no tenga un pedido especial):

select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

Entonces podrías reescribirlo así:

--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null 

union

--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

No es exactamente claro (suponiendo que no haya comentarios), pero hace el trabajo. Si esto es algo más que un hecho único (es decir, algo que alguien va a tener que volver y mantener algún día), usar una unión correcta podría aclarar cuál era la intención.

select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId

Lo cual es un poco más sucinto y claro (pero solo si quien lo está leyendo entiende bien se une). Tenga en cuenta que esto se puede escribir con combinaciones izquierdas, pero requiere una combinación anidada (con la que probablemente menos personas estén familiarizadas que las combinaciones correctas).

select p.*, o.*, d.*
from Persons p
left join Orders o 
    inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id

En este punto, es una opción de lo que está más claro y lo que la mayoría de la gente entenderá (¿sabrías cómo googlear esa sintaxis si no supieras que se llama una unión anidada?).

En resumen, no necesita estrictamente las combinaciones correctas, pero podrían facilitar su lectura.

Becuzz
fuente
Creo que tal vez solo eres diestro.
Robert Harvey
No sigo por qué no se puede escribir múltiples izquierda se une en este caso: SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID.
Zev Spitz
@RobertHarvey Lo soy, pero no estoy seguro de lo que tiene que ver la entrega.
Becuzz
@ZevSpitz Tal vez no estaba claro por lo que escribí, pero la idea era que solo quería los campos de los pedidos solo si existe un registro especial de detalles del pedido, es decir. deja unirse a ellos solo si el par de ellos existe.
Becuzz
-1

Pude ver un RIGHT JOIN siendo usado para replicación / fusión. Digamos que tengo dos tablas A y B. A está a la izquierda y B está a la derecha. Digamos que quería replicar datos entre estas dos tablas para hacerlas equivalentes.

Si quisiera mostrar todos los datos que estaban en A pero no en B, sería una unión IZQUIERDA. Si quisiera mostrar todos los datos en B que no estaban en A, se uniría DERECHO.

Por lo tanto, a veces IZQUIERDA y DERECHA resultan útiles al combinar y replicar datos para mantener las cosas en perspectiva.

Aparte de eso, no veo otra razón para usar una combinación DERECHA ya que todas las combinaciones DERECHA se pueden convertir en combinaciones IZQUIERDA o viceversa, todas las combinaciones IZQUIERDA se pueden convertir en combinaciones DERECHA dependiendo de cómo se ordenan o visualizan las tablas. Por lo tanto, sería una cuestión de preferencia en otros casos.

Aquí hay un buen enlace para visualizar las Uniones SQL.

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

Jon Raynor
fuente
-1

la unión izquierda no es el opuesto de la unión derecha, verifique el siguiente caso que da resultados diferentes

select * from 
(select 1 as x  where 1=1) a left join 
(select 1 as x  where 1=0) b on a.x=b.x inner join 
(select 1 as x  where 1=1) c on b.x=c.x

select * from 
(select 1 as x where 1=1) c inner join 
(select 1 as x where 1=0) b on c.x=b.x right join 
(select 1 as x where 1=1) a on b.x=a.x

las tablas b anc c están siempre unidas internamente, pero en la primera a se deja unida a las demás y en la segunda a se une a la derecha

la unión izquierda no devuelve filas mientras que la unión derecha devuelve una fila

jacob m
fuente
esto se lee más como un comentario tangencial, vea Cómo responder
mosquito
-2

Nunca hay ninguna razón para preferir RIGHT JOIN, y LEFT JOINes mucho más claro:

SELECCIONAR Personas. *, Pedidos. * DE Personas IZQUIERDA ÚNETE Pedidos EN Personas.ID = Pedidos.PersonID

ya que le permite ver de inmediato qué tabla se está consultando. Mientras que con RIGHT JOIN:

SELECCIONAR Personas. *, Pedidos. * DE ÓRDENES DERECHO ÚNETE Personas EN ÓRDENES.PersonID = Personas.ID

La primera tabla se escribe después de JOIN.

En mi experiencia, nunca he visto a RIGHT JOIN.

kirie
fuente
1
¿Qué agrega esto a la pregunta? La pregunta no es cuál es la diferencia. ; La pregunta es ¿por qué debería usar RIGHT JOIN? .
Zev Spitz
@ZevSpitz Usted pregunta por la razón para preferir cuál, le doy una razón. El caso de uso no importa, ya que es cuestión de gustos.
kirie