Diferença entre junção esquerda e direita no SQL Server

225

Eu sei sobre junções no SQL Server.

Por exemplo. Existem duas tabelas Tabela1, Tabela2.

Suas estruturas de tabela são as seguintes.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Tabela 1:

    Id     Name     
    -------------
    1      A        
    2      B    

Dados da Tabela2 da seguinte maneira:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Se eu executar as duas instruções SQL mencionadas abaixo, ambas as saídas serão as mesmas

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Por favor, explique a diferença entre junção esquerda e direita nas instruções SQL acima.

Pankaj Agarwal
fonte

Respostas:

73
Select * from Table1 left join Table2 ...

e

Select * from Table2 right join Table1 ...

são de fato completamente intercambiáveis. Tente no entanto Table2 left join Table1(ou seu par idêntico Table1 right join Table2) para ver a diferença. Essa consulta deve fornecer mais linhas, pois a Tabela2 contém uma linha com um ID que não está presente na Tabela1.

Péter Török
fonte
17
Então, por que precisamos RIGHT JOINse podemos alcançar qualquer resultado desejado com apenas LEFT JOIN? : P
user1857492
1
@ SilapAliyev Essa é realmente uma pergunta muito boa. Alguém pode responder? : D
Ian Chu Te
21
Select * from Table1 left join Table 2retornará TODOS os registros da tabela 1 mais registros coincidentes da Tabela 2. O oposto Select * from Table1 right join Table 2retornaria TODOS os registros da Tabela 2 e registros coincidentes da Tabela 1. Espera que ajude.
Programador Adagal 12/01
3
se você usar mais de duas tabelas, o uso da junção correta pode ser significativo e legível #
#: 26116
1
@MarkusMeskanen você está alterando uma frase simples de 7 palavras. Quando vc tem uma sentença de 356 linhas com vários subsentences e necessidade de mudar a lógica da esquerda à direita você ewill saber alterá-lo com apenas oneword ...
Programador Adagal
1014

O Codeproject possui esta imagem que explica os fundamentos simples das junções SQL, extraídos de: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx Junções SQL explicadas

Daan Timmer
fonte
64
Não há muitos 'detalhes' lá. O crédito deve realmente ir para a página de projeto de código em vez de para mim. Mas é claro que não me importo com a atenção :-)
Daan Timmer
6
@ Daan Timmer não, deve haver crédito para você também! Você reembala e revende para atender a uma demanda específica e específica. Varejistas fazer o mesmo e obter $$ bilhões
BKSpurgeon
Acho que podemos exigir a condição "AND" na cláusula where da última figura de "Outer Excluding JOIN". Sinto consulta precisa ser atualizado para selecionar <select_list> FROM Table_A um full OUTER JOIN table_b B ON A.Key = B.Key ONDE A.Key é nula e B.Key IS NULL
vinsinraw
@vinsinraw que não é necessário. Porque isso já está coberto pela condição: JOIN Table_B b ON A.Key = B.Key. A condição OR funciona muito bem.
Daan Timmer
Esse é um abuso comum dos diagramas de Venn. Os círculos A e B não representam as tabelas A e B, o círculo A é A JOIN ESQUERDA B & cirlce B é A JOIN DIREITA B. Também não importa qual é a condição ON e as teclas são irrelevantes e WHEREs não funcionam todos os caso. Veja meus comentários e respostas nesta página e nesta seção Diagramas de Re Venn .
precisa saber é
37

A tabela da qual você está obtendo dados é 'ESQUERDA'.
A tabela na qual você está ingressando é 'DIREITA'.
JUNTA ESQUERDA: Pegue todos os itens da tabela esquerda E (apenas) itens correspondentes da tabela direita.
JUNTA DIREITA: Pegue todos os itens da tabela direita E (apenas) itens correspondentes da tabela esquerda.
Assim:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

dá:

Id     Name       
-------------  
1      A          
2      B      

mas:

Select * from Table1 right join Table2 on Table1.id = Table2.id

dá:

Id     Name       
-------------  
1      A          
2      B   
3      C  

você estava certo ingressando na tabela com menos linhas na tabela com mais linhas
E
novamente, deixado unindo a tabela com menos linhas na tabela com mais linhas
Tente:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  
vbole
fonte
22

(INNER) JOIN: Retorna registros que possuem valores correspondentes nas duas tabelas.

JUNTA ESQUERDA (EXTERIOR): Retorna todos os registros da tabela esquerda e os registros correspondentes da tabela direita.

JUNTA DIREITA (EXTERIOR): Retorna todos os registros da tabela da direita e os registros correspondentes da tabela da esquerda.

JUNÇÃO COMPLETA (EXTERIOR): Retorna todos os registros quando houver uma correspondência na tabela esquerda ou direita

Por exemplo, vamos supor que temos duas tabelas com os seguintes registros:

Quadro A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Quadro B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Junção interna

Nota: Fornece a interseção de duas tabelas.

Junção interna

Sintaxe

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Aplique-o na sua tabela de amostra:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

O resultado será:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Associação à esquerda

Nota: fornecerá todas as linhas selecionadas na Tabela A, além de quaisquer linhas selecionadas comuns na Tabela B.

Associação à esquerda

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Aplique-o na sua tabela de amostra

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

O resultado será:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Right Join

Nota: fornecerá todas as linhas selecionadas na Tabela B, além de quaisquer linhas selecionadas comuns na Tabela A.

Right Join

Sintaxe:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Aplique-o na sua tabela de samole:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

O resultado será:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Junção completa

Nota: É igual à operação de união, retornará todos os valores selecionados das duas tabelas.

Junção completa

Sintaxe:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Aplique no seu samp [le table:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

O resultado será:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Alguns fatos

Para INNER ingressa no pedido, não importa

Para uniões EXTERIOR (ESQUERDA, DIREITA ou CHEIA), a ordem é importante

Encontre mais em w3schools

Sushank Pokharel
fonte
12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

A tabela fromneste exemplo tableAestá no lado esquerdo da relação.

tableA <- tableB
[left]------[right]

Portanto, se você quiser obter todas as linhas da tabela esquerda ( tableA), mesmo se não houver correspondências na tabela direita ( tableB), use o "join esquerdo".

E se você deseja obter todas as linhas da tabela direita ( tableB), mesmo que não haja correspondências na tabela esquerda (tableA ), você usará o right join.

Portanto, a consulta a seguir é equivalente à usada acima.

select fields
from tableB 
right join tableA on tableB.key = tableA.key
Moraes
fonte
10

Você parece estar se perguntando: "Se posso reescrever uma sintaxe RIGHT OUTER JOINusando LEFT OUTER JOIN, por que ter uma RIGHT OUTER JOINsintaxe?" Eu acho que a resposta para essa pergunta é, porque os designers da linguagem não querem impor essa restrição aos usuários (e acho que eles seriam criticados se o fizessem), o que forçaria os usuários a mudar a ordem das tabelas na FROMcláusula em algumas circunstâncias, quando apenas altera o tipo de junção.

um dia quando
fonte
às vezes, as junções externas esquerda e direita são completamente intercambiáveis, correto?
ス レ 9 ク ス
4
@ Alex: de fato, as junções externas esquerda e direita são sempre intercambiáveis.
precisa saber é o seguinte
8

Suas duas declarações são equivalentes.

A maioria das pessoas usa apenas LEFT JOINuma vez que parece mais intuitivo e é uma sintaxe universal - não acho que todo o RDBMS suporte RIGHT JOIN.

JNK
fonte
"Não acho que todos os RDBMS suportem RIGHT JOIN" - claro, nem todos os RDBMSs suportam SQL. Mas se você está sugerindo que alguns produtos SQL suportam, LEFTmas não RIGHT, indique quais.
precisa saber é o seguinte
10
@onedaywhen Por exemplo, o SQLite 3 não implementa RIGHTe FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13
0

Eu sinto que podemos exigir ANDcondição na wherecláusula da última figura de Outer Excluding JOINpara que possamos obter o resultado desejado de A Union B Minus A Interaction B. Sinto que a consulta precisa ser atualizada para

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Se usarmos OR, obteremos todos os resultados deA Union B

vinsinraw
fonte
0

selecione * da Tabela1, junte-se à esquerda na Tabela2 na Tabela1.id = Tabela2.id

Na primeira consulta A junção esquerda compara a tabela do lado esquerdo table1 com a tabela do lado direito table2 .

Em Quais todas as propriedades da tabela1 serão mostradas, enquanto na tabela2 somente essas propriedades serão mostradas em que condição será verdadeira.

selecione * da Tabela2 junte-se à direita à Tabela1 na Tabela1.id = Tabela2.id

Na primeira consulta Unir à direita compara a tabela do lado direito table1 à tabela do lado esquerdo table2 .

Em Quais todas as propriedades da tabela1 serão mostradas, enquanto na tabela2 somente essas propriedades serão mostradas em que condição será verdadeira.

Ambas as consultas fornecerão o mesmo resultado, porque a ordem da declaração da tabela na consulta é diferente, como você está declarando table1 e table2 à esquerda e à direita, respectivamente, na primeira consulta de junção à esquerda , e também declarando table1 e table2 à direita e à esquerda, respectivamente, na segunda junção à direita inquerir.

Essa é a razão pela qual você está obtendo o mesmo resultado nas duas consultas. Portanto, se você deseja resultados diferentes, execute essas duas consultas respectivamente,

selecione * da Tabela1, junte-se à esquerda na Tabela2 na Tabela1.id = Tabela2.id

selecione * da Tabela1, junte-se à direita na Tabela2 na Tabela1.id = Tabela2.id

Nisarg Shah
fonte
0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Por definição: Junção à esquerda seleciona todas as colunas mencionadas com a palavra-chave "select" da Tabela 1 e as colunas da Tabela 2 que correspondem aos critérios após a palavra-chave "on".

Da mesma forma, Por definição: Junção Direita seleciona todas as colunas mencionadas com a palavra-chave "select" da Tabela 2 e as colunas da Tabela 1 que correspondem aos critérios após a palavra-chave "on".

Referindo-se à sua pergunta, os IDs nas duas tabelas são comparados com todas as colunas necessárias para serem lançadas na saída. Portanto, os IDs 1 e 2 são comuns nas tabelas e, como resultado, você terá quatro colunas com as colunas id e name da primeira e da segunda tabelas em ordem.

*select * from Table1 left join Table2 on Table1.id = Table2.id

A expressão acima leva todos os registros (linhas) da tabela 1 e colunas, com os IDs correspondentes da tabela 1 e tabela 2, da tabela 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Da mesma forma, a partir da expressão acima, são obtidos todos os registros (linhas) da tabela 1 e colunas, com os IDs correspondentes da tabela 1 e da tabela 2, da tabela 2. (lembre-se, essa é uma junção correta, portanto, todas as colunas da tabela2 e não da tabela 1 será considerado).

VDWWD
fonte