Motivo per preferire JOIN DESTRA rispetto a JOIN SINISTRA


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'intenzione della dichiarazione:

  • Per prima cosa prendi il Persons
  • Quindi espandere / ripetere il Personsnecessario per abbinare ilOrders

è meglio espresso dall'ordine di Persons LEFT JOIN Ordersche dall'ordine inverso Orders RIGHT JOIN Persons(e di conseguenza non uso mai RIGHT JOIN).

Ci sono situazioni in cui RIGHT JOINsi preferisce a? Oppure, ci sono casi d'uso in cui RIGHT JOINpuò fare qualcosa che LEFT JOINnon può?


12
Non riesco a ricordare un caso in cui volevo un join giusto. Ho avuto casi in cui il piano di esecuzione di una query ha capovolto un join sinistro in un join destro per motivi di prestazioni. Ma dal punto di vista della scrittura di codice puro, no, non ricordo di aver mai scritto un join corretto.
Brandon,

2
Non vedo questo come una domanda su "spiegare, scrivere o eseguire il debug del codice". Si sta chiedendo perché una lingua abbia due caratteristiche che apparentemente fanno la stessa cosa, se in realtà c'è qualche differenza tra loro e se non quando si preferisce quella "non ovvia".
Philip Kendall,

1
No, un join sinistro cattura quasi sempre ciò di cui hai più bisogno in modo succinto ed è più facile ragionare. Nel mio posto di lavoro, in realtà abbiamo uno standard in atto per prevenire i giunti giusti poiché non c'è mai un caso in cui sono necessari (cioè possono sempre essere sostituiti dal raccordo sinistro opposto).
mgw854,

8
Ho reimpostato i voti ravvicinati: questa domanda è in argomento qui, poiché la comprensione della differenza tra i join influisce sulla progettazione del software (la progettazione del database fa parte della progettazione del software, così come gli algoritmi che possono eseguire query sui database). Potrebbe anche essere in argomento presso gli amministratori di database e potrebbe esserci anche un duplicato.
Thomas Owens

1
Non sono sicuro se stai suggerendo che RIGHT JOINè raccomandato o più comune. Se questa è la tua premessa, non è corretta. Non riesco a pensare a una volta in cui ho mai visto il join giusto usato in entrambi i codici né negli esempi. È JOINo LEFT OUTER JOIN. In rari casi potresti vedere a FULL OUTER JOIN.
JimmyJames,

Risposte:


12

Dipende da quale requisito stai cercando di soddisfare.

Non è lo stesso dire: "dammi tutte le persone e i loro ordini corrispondenti" che "Voglio tutti gli ordini con le loro persone corrispondenti" , in particolare se hai intenzione di usare le is nullrighe senza corrispondenze corrispondenti. Questo è ciò che chiamo la "tabella dominante", ovvero la tabella da cui desidero recuperare le righe indipendentemente dal fatto che non vi sia una riga corrispondente nell'altro lato del join.

Guarda queste immagini e noterai che non sono le stesse:

inserisci qui la descrizione dell'immagine

La fonte dell'immagine è questo eccellente articolo .

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

Ma suppongo che per le persone occidentali abituate a scrivere da sinistra a destra sia più naturale usare i join di sinistra rispetto a quelli di destra , poiché vediamo come se volessimo che i join fossero nella stessa direzione o nello stesso ordine delle selectcolonne.

Quindi un possibile motivo per preferire un join destro è perché nella tua cultura scrivi da destra a sinistra (come nei sistemi di scrittura araba o ebraica) e tendi a pensare in quel modo, nel senso che forse nel tuo cervello scorre un flusso di informazioni testuali da destra a sinistra .

Alcuni linguisti pensano che la tua lingua influenzi il tuo modo di pensare: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think


1
Avevo iniziato a pensare in questo senso, ma non credo sia corretto. Ho iniziato a immaginare di scrivere SQL in ebraico (cosa che in realtà non ho mai fatto). OK: giustificato da destra, da destra a sinistra, dall'alto in basso. Prima menzionerai la tabella A e poi la tabella B. Con un join destro, escluderai (soprattutto nel caso nullo) la maggior parte o tutta la tabella menzionata per prima. Penso che la mente umana tende ad associarsi prima con la primaria e la più importante . Ciò si verifica indipendentemente dalla direzione di scrittura. Potresti chiamarli "FIRST JOIN" e "SECOND JOIN" e questo pregiudizio si verificherebbe comunque.
Mike supporta Monica il

Ho incluso un link all'immagine che hai mostrato di seguito.
Jon Raynor,

@Mike Non sto suggerendo alle persone di scrivere SQL in arabo o ebraico. Solo che forse l'orientamento della tua madrelingua potrebbe essere una ragione per preferire i giunti giusti. Ma questa è solo una possibilità. Trovo che i join di sinistra siano più naturali.
Tulains Córdova,

Ora ho dato il dovuto credito al creatore dell'immagine. L'ho avuto per anni nel mio HD e non mi ricordavo da dove venisse,
Tulains Córdova,

Sono fluente in ebraico e trovo ancora LEFT JOINpiù naturale.
Zev Spitz,

3

Non c'è nulla (che io sappia) che può 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 di tutti gli ordini che hanno con dettagli di ordini speciali (diremo che non tutti gli ordini hanno dettagli di ordini speciali). Quindi normalmente faresti un join sinistro dalle persone agli ordini. Ma poi devi unirti ai dettagli dell'ordine speciale. Se si utilizza un join interno lì, farebbe effettivamente 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 questo:

--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 (assumendo nessun commento), ma fa il lavoro. Se si tratta di qualcosa di più di una tantum (cioè qualcosa che qualcuno dovrà tornare e mantenere un giorno) usando un giusto join 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ù conciso e chiaro (ma solo se chi lo sta leggendo capisce le giuste iscrizioni). Si noti che questo può essere scritto con join di sinistra, ma richiede un join nidificato (con cui probabilmente meno persone conoscono i join di destra).

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 quella sintassi se non sapessi che è stato chiamato un join nidificato?).

In breve, non sono strettamente necessari i giusti join, ma potrebbero rendere più semplice la lettura.


Penso che forse sei solo per la mano destra.
Robert Harvey,

Non seguo il motivo per cui non si può scrivere più a sinistra si unisce in questo 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,

Lo sono @RobertHarvey, ma non sono sicuro di cosa abbia a che fare la mano.
Becuzz,

@ZevSpitz Forse non era chiaro da quello che ho scritto, ma l'idea era che tu volessi i campi dagli ordini solo se esiste un record di dettagli dell'ordine speciale, ad es. lasciali unisci solo se esiste la coppia.
Becuzz,

-1

Ho potuto vedere un JOIN GIUSTO utilizzato per scopi di replica / unione. Diciamo che ho due tabelle A e B. A è a sinistra e B è a destra. Diciamo che volevo replicare i dati tra queste due tabelle per renderle 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.

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

Oltre a ciò, non vedo nessun altro motivo per utilizzare un join DESTRO poiché tutti i join DESTRO possono essere convertiti in join LEFT o viceversa tutti i join LEFT possono essere convertiti in join DESTRA a seconda di come vengono ordinate o visualizzate le tabelle. Quindi, sarebbe una questione di preferenza in altri casi.

Ecco un bel link per visualizzare i join SQL.

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


-1

il join sinistro non è l'opposto del join destro, controllare il caso seguente che fornisce risultati diversi

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

le tabelle sono sempre unite all'interno ma nella prima a viene unita a sinistra alle altre e nella seconda a viene unita a destra

il join sinistro non restituisce righe mentre il join destro restituisce una riga


questo sembra più un commento tangenziale, vedi Come rispondere
moscerino del

-2

Non c'è mai motivo di preferire RIGHT JOIN, ed LEFT JOINè molto più chiaro:

SELEZIONA Persone. *, Ordini. * DA Persone SINISTRA UNISCITI Ordini SU People.ID = Orders.PersonID

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

SELEZIONA Persone. *, Ordini. * DA Ordini DIRITTO UNISCITI Persone SU Orders.PersonID = Persons.ID

la prima tabella è scritta dopo il JOIN.

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


1
Cosa aggiunge questo alla domanda? La domanda non è qual è la differenza? ; La domanda è: perché dovrei usare RIGHT JOIN? .
Zev Spitz,

@ZevSpitz Stai chiedendo il motivo per preferire quale, ti do un motivo. Quale caso d'uso non ha importanza poiché è questione di gusti.
Kirie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.