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
Persons
conforme necessário para corresponder aoOrders
é melhor expresso pela ordem do Persons LEFT JOIN Orders
que pela ordem inversa Orders RIGHT JOIN Persons
(e nunca uso RIGHT JOIN
como resultado).
Existem situações em que a RIGHT JOIN
é preferida? Ou existem casos de uso em que é RIGHT JOIN
possível fazer algo que LEFT JOIN
não pode?
database-design
sql
relational-database
Zev Spitz
fonte
fonte
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. ÉJOIN
ouLEFT OUTER JOIN
. Em casos raros, você pode ver aFULL OUTER JOIN
.Respostas:
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 null
para 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:
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
select
colunas 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
fonte
LEFT JOIN
mais natural.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:
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):
Então você pode reescrevê-lo da seguinte maneira:
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.
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).
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.
fonte
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
.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
fonte
junção esquerda não é o oposto de junção direita, verifique o seguinte caso, que fornece resultados diferentes
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
fonte
Nunca há motivo para preferir
RIGHT JOIN
eLEFT JOIN
é muito mais claro:pois permite ver imediatamente qual tabela está sendo consultada. Considerando que com
RIGHT JOIN
:a primeira tabela é escrita após o
JOIN
.Na minha experiência, eu nunca vi
RIGHT JOIN
.fonte
RIGHT JOIN
? .