Razão para preferir RIGHT JOIN do que LEFT JOIN


18

Se bem entendi, todos RIGHT JOIN:

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

pode ser expresso como LEFT JOIN:

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

Minha opinião pessoal é que a intenção da declaração:

  • Primeiro obtenha o Persons
  • Em seguida, expanda / repita o Personsconforme necessário para corresponder aoOrders

é melhor expresso pela ordem do Persons LEFT JOIN Ordersque pela ordem inversa Orders RIGHT JOIN Persons(e nunca uso RIGHT JOINcomo resultado).

Existem situações em que a RIGHT JOINé preferida? Ou existem casos de uso em que é RIGHT JOINpossível fazer algo que LEFT JOINnão pode?


12
Não me lembro de um caso em que queria uma junção correta. Eu tive casos em que o plano de execução de uma consulta inverteu uma junção esquerda em uma junção direita por motivos de desempenho. Mas, do ponto de vista da escrita de código, não me lembro de ter escrito uma junção correta.
Brandon

2
Não vejo isso como uma pergunta sobre "explicar, escrever ou depurar código". Ele está perguntando por que uma linguagem tem dois recursos que aparentemente fazem a mesma coisa, se há realmente alguma diferença entre eles e se não, quando o idioma "não óbvio" seria preferido.
Philip Kendall

1
Não, uma junção esquerda quase sempre captura o que você precisa de forma mais sucinta e é mais fácil de raciocinar. No meu local de trabalho, na verdade, temos um padrão para impedir as junções direitas, pois nunca há um caso em que elas são necessárias (ou seja, elas sempre podem ser substituídas pela junção esquerda oposta).
mgw854

8
Redefinei os votos apertados - esta questão é um tópico aqui, pois a compreensão da diferença entre junções afeta o design de software (o design do banco de dados faz parte do design do software, assim como os algoritmos que podem consultar os bancos de dados). Também pode estar no tópico em Administradores de banco de dados e também pode haver uma duplicata.
Thomas Owens

1
Não tenho certeza se você está sugerindo que RIGHT JOINé recomendado ou mais comum. Se essa é sua premissa, está incorreta. Não consigo pensar em um momento em que eu já vi a junção correta ser usada no código nem nos exemplos. É JOINou LEFT OUTER JOIN. Em casos raros, você pode ver a FULL OUTER JOIN.
JimmyJames

Respostas:


12

Isso depende de qual requisito você está tentando cumprir.

Não é o mesmo a dizer: "dê-me todas as pessoas e suas ordens correspondentes" que "Quero todos os pedidos com as pessoas correspondentes" , especialmente se você for usar is nullpara criar linhas sem correspondência correspondente. É o que chamo de "tabela dominante", que é a tabela da qual quero buscar linhas, independentemente de não haver uma linha correspondente no outro lado da junção.

Olhe para estas imagens e você notará que elas não são as mesmas:

insira a descrição da imagem aqui

Fonte da imagem é este excelente artigo .

Mas você está certo de que ambos os requisitos podem ser atendidos com uma das junções apenas invertendo a ordem das tabelas na junção.

Mas acho que, para os ocidentais acostumados a escrever da esquerda para a direita, é mais natural usar junções da esquerda sobre junções da direita , pois vemos que queremos que as junções estejam na mesma direção ou na mesma ordem que as selectcolunas ed.

Portanto, um possível motivo para preferir uma junção à direita é porque, em sua cultura, você escreve da direita para a esquerda (como nos sistemas de escrita em árabe ou hebraico) e tende a pensar dessa maneira, o que significa que talvez em seu cérebro as informações textuais fluam da direita para a esquerda .

Alguns linguistas acham que seu idioma influencia seu modo de pensar: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think


1
Eu comecei a pensar nesse sentido, mas não acho que esteja correto. Comecei a imaginar escrever SQL em hebraico (o que nunca havia feito). OK: justificado à direita, da direita para a esquerda, de cima para baixo. Você ainda mencionará a tabela A primeiro e depois a tabela B. Com uma junção correta, você excluirá (especialmente no caso nulo) a maioria ou a totalidade da tabela mencionada primeiro. Eu acho que a mente humana tende a se associar primeiro com a primária e a mais importante . Isso ocorre independentemente da direção da escrita. Você poderia chamá-los de "PRIMEIRO JOIN" e "SEGUNDO JOIN" e esse viés ainda ocorreria.
Mike Suporta Monica

Incluímos um link para a imagem que você mostrou abaixo.
Jon Raynor

@ Mike Não estou sugerindo que as pessoas escrevam SQL em árabe ou hebraico. Só que talvez a orientação da sua língua materna possa ser uma razão para você preferir a união correta. Mas isso é apenas uma possibilidade. Acho que a esquerda se junta mais natural.
Tulains Córdova

Agora dei o devido crédito ao criador da imagem. Eu tive-o durante anos no meu HD e eu não me lembro de onde veio,
Tulains Córdova

Sou fluente em hebraico e ainda acho LEFT JOINmais natural.
Zev Spitz #

3

Não há nada (que eu saiba) que possa ser feito com uma junção direita que não possa ser feito com uma junção esquerda. Mas às vezes a sintaxe com junções esquerdas é mais feia. Digamos que você tenha as seguintes tabelas:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

Digamos que você precise obter uma lista de todas as pessoas em seu banco de dados e todos os pedidos que eles tiverem com detalhes especiais do pedido (diremos que nem todos os pedidos têm detalhes especiais do pedido). Então você normalmente faria uma junção esquerda de pessoas para pedidos. Mas você precisa participar de detalhes especiais de pedidos. Se você usar uma junção interna lá, efetivamente tornaria a junção esquerda de pessoas para pedidos em uma junção interna. IE: é isso que você deseja fazer, mas não funciona (ele excluirá qualquer pessoa que não tenha um 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

Então você pode reescrevê-lo da seguinte maneira:

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

Não é exatamente claro (assumindo que não há comentários), mas ele faz o trabalho. Se isso é algo mais do que um caso pontual (ou seja, algo que alguém terá que voltar e manter um dia) usando uma junção correta, pode deixar mais claro qual era a intenção.

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

O que é um pouco mais sucinto e claro (mas apenas se quem estiver lendo o livro entender as junções corretas). Observe que isso pode ser escrito com junções esquerdas, mas requer uma junção aninhada (com a qual provavelmente menos pessoas estão familiarizadas do que junções direitas).

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

Nesse ponto, é uma escolha do que é mais claro e do que a maioria das pessoas entenderá (você saberia como pesquisar no Google essa sintaxe se não soubesse que ela era chamada de junção aninhada?).

Em resumo, você não precisa estritamente de junções corretas, mas elas podem facilitar a leitura.


Eu acho que talvez você seja destro.
21416 Robert Harvey

Eu não sigo por que você não pode escrever múltipla esquerda junta-se neste 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 eu sou, mas não sei ao certo o que a entrega tem a ver com isso.
Becuzz

@ZevSpitz Talvez não tenha ficado claro com o que escrevi, mas a idéia era que você só queria os campos dos pedidos se existir um registro especial de detalhes do pedido, ou seja. deixou juntá-los apenas se o par deles existir.
Becuzz

-1

Pude ver um DIREITO JOIN sendo usado para fins de replicação / mesclagem. Digamos que eu tenho duas tabelas A e B. A está à esquerda e B está à direita. Digamos que eu queira replicar dados entre essas duas tabelas para torná-los equivalentes.

Se eu quisesse mostrar todos os dados que estavam em A, mas não em B, seria uma junção ESQUERDA. Se eu quisesse mostrar todos os dados em B que não estavam em A, ele se juntaria à DIREITA.

Portanto, algumas vezes, ESQUERDA e DIREITA são úteis ao mesclar e replicar dados para manter as coisas em perspectiva.

Fora isso, não vejo outro motivo para usar uma junção RIGHT, pois todas as junções RIGHT podem ser convertidas em junções ESQUERDA ou vice-versa. Portanto, seria uma questão de preferência em outros casos.

Aqui está um bom link para visualizar as junções do SQL.

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


-1

junção esquerda não é o oposto de junção direita, verifique o seguinte caso, que fornece 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

As tabelas b anc c são sempre unidas internamente, mas na primeira a é deixada unida às demais e na segunda a é unida à direita

junção esquerda não retorna linhas, enquanto junção direita retorna uma linha


isso parece mais um comentário tangencial, consulte Como responder
gnat

-2

Nunca há motivo para preferir RIGHT JOINe LEFT JOINé muito mais claro:

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

pois permite ver imediatamente qual tabela está sendo consultada. Considerando que com RIGHT JOIN:

SELECT People. *, Orders. * FROM Orders DIREITA JUNTA Pessoas ON Orders.PersonID = Persons.ID

a primeira tabela é escrita após o JOIN.

Na minha experiência, eu nunca vi RIGHT JOIN.


1
O que isso acrescenta à pergunta? A questão não é qual é a diferença? ; A questão é por que devo usar RIGHT JOIN? .
Zev Spitz

@ ZevSpitz Você está pedindo a razão para preferir qual, eu lhe dou uma razão. Qual caso de uso não importa, pois é uma questão de gosto.
kirie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.