Motivo per preferire RIGHT JOIN over LEFT JOIN

18

Se capisco correttamente, ogni RIGHT JOIN :

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

può essere espresso come LEFT JOIN :

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

La mia opinione personale è che l'intento della dichiarazione:

  • Prima ottieni Persons
  • Quindi espandi / ripeti Persons come necessario per far corrispondere il Orders

è meglio espresso dall'ordine di Persons LEFT JOIN Orders che dall'ordine inverso Orders RIGHT JOIN Persons (e non utilizzo mai RIGHT JOIN come risultato).

Ci sono situazioni in cui è preferito un RIGHT JOIN ? Oppure, ci sono casi d'uso in cui RIGHT JOIN può fare qualcosa che LEFT JOIN non può?

    
posta Zev Spitz 14.11.2016 - 13:47
fonte

4 risposte

12

Dipende dal requisito che stai cercando di soddisfare.

Non è lo stesso dire: "dammi tutte le persone e i loro ordini corrispondenti" che "Voglio tutti gli ordini con le persone corrispondenti" , in particolare se stai andando usare is null per portare file senza corrispondenze corrispondenti. Questo è ciò che chiamo la "tabella dominante", che è la tabella che voglio recuperare dalle righe indipendentemente dal fatto che non ci sia una riga corrispondente nell'altro lato del join.

Guarda queste immagini e noterai che non sono le stesse:

La fonte dell'immagine è questo eccellente articolo .

Ma hai ragione nel fatto che entrambi i requisiti possono essere soddisfatti con entrambi i join semplicemente invertendo l'ordine delle tabelle nel join.

Ma immagino che per gli occidentali abituati a scrivere da sinistra a destra sia più naturale usare i join di sinistra sui giusti giusti , dal momento che vediamo come vogliamo che i join si trovino nel stessa direzione o nello stesso ordine delle colonne select ed.

Quindi un possibile motivo per preferire un join giusto è perché nella tua cultura scrivi da destra a sinistra (come nei sistemi di scrittura arabi o ebraici) e tendi a pensare in questo modo, forse a nel tuo cervello le informazioni testuali fluiscono da destra a sinistra.

Alcuni linguisti pensano che la tua lingua influenzi il tuo modo di pensare: link

    
risposta data 14.11.2016 - 20:42
fonte
2

Non c'è nulla (che io sappia) che possa essere fatto con un join destro che non può essere fatto con un join sinistro. Ma a volte la sintassi con i join di sinistra è più brutta. Supponiamo che tu abbia le seguenti tabelle:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

Supponiamo che tu abbia bisogno di ottenere un elenco di tutte le persone nel tuo database e degli ordini che hanno con i dettagli degli ordini speciali (diremo che non tutti gli ordini hanno dettagli sugli ordini speciali). Quindi normalmente farai un join di sinistra dalle persone agli ordini. Ma poi devi unirti ai dettagli dell'ordine speciale. Se si utilizza un join interno, esso renderebbe efficacemente il join sinistro dalle persone agli ordini in un join interno. IE: questo è quello che vuoi fare ma non funziona (escluderà chiunque non abbia un ordine speciale):

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

Quindi potresti riscriverlo come segue:

--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

Non esattamente chiaro (supponendo che non ci siano commenti), ma fa il lavoro. Se questo è qualcosa di più di una tantum (cioè qualcosa che qualcuno dovrà tornare e mantenere un giorno) usando un join giusto potrebbe rendere più chiaro quale fosse l'intento.

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

Che è un po 'più succinto e chiaro (ma solo se chi sta leggendo comprende giusti join). Nota che questo può essere scritto con i join di sinistra, ma richiede un join nidificato (con meno probabilità che le persone abbiano familiarità con i giusti join).

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

A questo punto, è una scelta di ciò che è più chiaro e ciò che la maggior parte delle persone capirà (sapresti come google che sintassi se non sapessi che è stato chiamato un join annidato?).

In breve, non hai strettamente bisogno giusti giusti, ma potrebbero renderlo più facile da leggere.

    
risposta data 14.11.2016 - 16:37
fonte
-1

Potrei vedere un RIGHT JOIN usato per scopi di replica / fusione. Diciamo che ho due tavoli A e B. A è a sinistra e B è a destra. Diciamo che volevo replicare i dati tra questi due tavoli per renderli equivalenti.

Se volessi mostrare tutti i dati che erano in A ma non in B, sarebbe un join SINISTRO. Se volessi mostrare tutti i dati in B che non erano in A, sarebbe GIUSTO unirsi.

Quindi, a volte LEFT e RIGHT tornano utili quando si uniscono e si replicano i dati per mantenere le cose in prospettiva.

Oltre a questo, non vedo nessun altro motivo per usare un join RIGHT dato che tutti i join di RIGHT possono essere convertiti in join LEFT o viceversa tutti i join LEFT possono essere convertiti in join RIGHT a seconda di come i tavoli sono ordinati o visualizzati. Quindi, sarebbe una questione di preferenza in altri casi.

Ecco un link per visualizzare i join di SQL.

link

    
risposta data 14.11.2016 - 21:04
fonte
-2

Non c'è mai alcun motivo per preferire RIGHT JOIN e LEFT JOIN è molto più chiaro:

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

in quanto consente di vedere immediatamente quale tabella viene interrogata. Mentre con RIGHT JOIN :

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

la prima tabella viene scritta dopo JOIN .

Nella mia esperienza, non ho mai visto un RIGHT JOIN .

    
risposta data 14.11.2016 - 17:02
fonte

Leggi altre domande sui tag