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.
sql
sql-server
join
left-join
right-join
Pankaj Agarwal
fonte
fonte
RIGHT JOIN
se podemos alcançar qualquer resultado desejado com apenasLEFT JOIN
? : PSelect * from Table1 left join Table 2
retornará TODOS os registros da tabela 1 mais registros coincidentes da Tabela 2. O opostoSelect * from Table1 right join Table 2
retornaria TODOS os registros da Tabela 2 e registros coincidentes da Tabela 1. Espera que ajude.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
fonte
JOIN Table_B b ON A.Key = B.Key
. A condição OR funciona muito bem.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:
dá:
mas:
dá:
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:
fonte
(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:
Junção interna
Sintaxe
Aplique-o na sua tabela de amostra:
O resultado será:
Associação à esquerda
Aplique-o na sua tabela de amostra
O resultado será:
Right Join
Sintaxe:
Aplique-o na sua tabela de samole:
O resultado será:
Junção completa
Sintaxe:
Aplique no seu samp [le table:
O resultado será:
Para INNER ingressa no pedido, não importa
Para uniões EXTERIOR (ESQUERDA, DIREITA ou CHEIA), a ordem é importante
Encontre mais em w3schools
fonte
A tabela
from
neste exemplotableA
está no lado esquerdo da relação.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á oright join
.Portanto, a consulta a seguir é equivalente à usada acima.
fonte
Você parece estar se perguntando: "Se posso reescrever uma sintaxe
RIGHT OUTER JOIN
usandoLEFT OUTER JOIN
, por que ter umaRIGHT OUTER JOIN
sintaxe?" 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 naFROM
cláusula em algumas circunstâncias, quando apenas altera o tipo de junção.fonte
Suas duas declarações são equivalentes.
A maioria das pessoas usa apenas
LEFT JOIN
uma vez que parece mais intuitivo e é uma sintaxe universal - não acho que todo o RDBMS suporteRIGHT JOIN
.fonte
LEFT
mas nãoRIGHT
, indique quais.RIGHT
eFULL OUTER JOIN
: sqlite.org/omitted.htmlEu sinto que podemos exigir
AND
condição nawhere
cláusula da última figura deOuter Excluding JOIN
para que possamos obter o resultado desejado deA Union B Minus A Interaction B
. Sinto que a consulta precisa ser atualizada paraSe usarmos
OR
, obteremos todos os resultados deA Union B
fonte
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
fonte
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).
fonte