Qual é a diferença entre CROSS JOIN e FULL OUTER JOIN no SQL Server?
Eles são iguais ou não? Por favor explique. Quando alguém usaria um desses?
Qual é a diferença entre CROSS JOIN e FULL OUTER JOIN no SQL Server?
Eles são iguais ou não? Por favor explique. Quando alguém usaria um desses?
Respostas:
Uma junção cruzada produz um produto cartesiano entre as duas tabelas, retornando todas as combinações possíveis de todas as linhas. Não tem on
cláusula porque você está juntando tudo a tudo.
A full outer join
é uma combinação de a left outer
e right outer
join. Ele retorna todas as linhas nas duas tabelas que correspondem à where
cláusula da consulta e, nos casos em que a on
condição não pode ser satisfeita para essas linhas, ela coloca null
valores nos campos não preenchidos .
Este artigo da wikipedia explica os vários tipos de junções com exemplos de saída, dados um conjunto de tabelas de amostra.
outer join
mais rápido ou cross join
?
Uma coisa que nem sempre pode ser óbvia para alguns é que uma junção cruzada com uma tabela vazia (ou conjunto de resultados) resulta em tabela vazia (M x N; portanto, M x 0 = 0)
Uma junção externa completa sempre terá linhas, a menos que M e N sejam 0.
Gostaria de acrescentar um aspecto importante a outras respostas, que na verdade me explicaram esse tópico da melhor maneira:
Se duas tabelas unidas contiverem M e N linhas, a junção cruzada sempre produzirá (M x N) linhas, mas a junção externa completa produzirá das linhas MAX (M, N) a (M + N) (dependendo de quantas linhas realmente corresponder ao predicado "on").
EDITAR:
Do ponto de vista lógico do processamento de consultas, o CROSS JOIN realmente sempre produz M x N linhas. O que acontece com FULL OUTER JOIN é que as tabelas esquerda e direita são "preservadas", como se as associações ESQUERDA e DIREITA tivessem acontecido. Portanto, as linhas, que não satisfazem o predicado ON, das tabelas esquerda e direita são adicionadas ao conjunto de resultados.
cross join
multiplica as tabelas; a full outer join
adiciona-los no pior dos casos, dependendo de quantas linhas corresponder ..
Junção cruzada: as junções cruzadas produzem resultados que consistem em todas as combinações de linhas de duas ou mais tabelas. Isso significa que se a tabela A tiver 3 linhas e a tabela B tiver 2 linhas, um CROSS JOIN resultará em 6 linhas. Não existe um relacionamento estabelecido entre as duas tabelas - você literalmente produz apenas todas as combinações possíveis.
Junção externa completa: uma junção externa completa não é "esquerda" nem "direita" - são as duas coisas! Ele inclui todas as linhas de ambas as tabelas ou conjuntos de resultados que participam do JOIN. Quando não existem linhas correspondentes para as linhas no lado "esquerdo" do JOIN, você vê valores nulos do conjunto de resultados no "direito". Por outro lado, quando não existem linhas correspondentes para as linhas no lado "direito" de JOIN, você vê valores nulos do conjunto de resultados na "esquerda".
Para o SQL Server, CROSS JOIN and FULL OUTER JOIN
são diferentes.
CROSS JOIN
é simplesmente um produto cartesiano de duas tabelas, independentemente de qualquer critério de filtro ou condição.
FULL OUTER JOIN
fornece um conjunto de resultados exclusivo LEFT OUTER JOIN and RIGHT OUTER JOIN
de duas tabelas. Ele também precisa da cláusula ON para mapear duas colunas de tabelas.
A Tabela 1 contém 10 linhas e a Tabela 2 contém 20 linhas com 5 linhas correspondentes em colunas específicas.
Em seguida
CROSS JOIN
, retornará 10 * 20 = 200 linhas no conjunto de resultados.
FULL OUTER JOIN
retornará 25 linhas no conjunto de resultados.
FULL OUTER JOIN
(ou qualquer outro JOIN) sempre retorna o conjunto de resultados menor ou igual aCartesian Product number
.Número de linhas retornadas por
FULL OUTER JOIN
igual a (Nº de linhas porLEFT OUTER JOIN
) + (Nº de linhas porRIGHT OUTER JOIN
) - (Nº de linhas porINNER JOIN
).
Eles são os mesmos conceitos, além do valor NULL retornado.
Ver abaixo:
declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;
declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;
select
t1.*,
t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;
/* full outer join
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
1 11 NULL NULL
2 22 2 202
*/
select
t1.*,
t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;
/* cross join
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 2 202
1 11 10 101
2 22 2 202
2 22 10 101
*/
Junção cruzada : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; Gera todas as combinações possíveis entre 2 tabelas (produto cartesiano)
Junção externa (completa) : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Retorna todas as linhas das duas tabelas e também resultados com os mesmos valores (corresponde a CONDITION)
Uma junção externa completa combina uma junção externa esquerda e uma junção externa direita. O conjunto de resultados retorna linhas de ambas as tabelas em que as condições são atendidas, mas retorna colunas nulas onde não há correspondência.
Uma junção cruzada é um produto cartesiano que não requer nenhuma condição para associar tabelas. O conjunto de resultados contém linhas e colunas que são uma multiplicação de ambas as tabelas.
Aqui está um exemplo em que a junção externa completa e a junção cruzada retornam o mesmo conjunto de resultados sem a devolução de NULL. Observe o 1 = 1 na cláusula ON para a junção externa completa:
declare @table1 table ( col1 int, col2 int )
declare @table2 table ( col1 int, col2 int )
insert into @table1 select 1, 11 union all select 2, 22
insert into @table2 select 10, 101 union all select 2, 202
select *
from @table1 t1 full outer join @table2 t2
on 1 = 1
(2 linha (s) afetada) (2 linha (s) afetada) col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202
select *
from @table1 t1 cross join @table2 t2
col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202 (4 linha (s) afetada)
JUNÇÃO EXTERNA CHEIA DO SQL
O JOGO EXTERNO COMPLETO retorna todas as linhas da tabela esquerda (tabela1) e da tabela direita (tabela2), independentemente da correspondência.
A palavra-chave FULL OUTER JOIN combina o resultado de LEFT OUTTER JOIN e RIGHT OUTTER JOIN
Referência: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
No SQL CROSS JOIN Cada linha da primeira tabela é mapeada com cada linha da segunda tabela.
O número de linhas produzidas por um conjunto de resultados da operação CROSS JOIN é igual ao número de linhas na primeira tabela multiplicado pelo número de linhas na segunda tabela.
CROSS JOIN também é conhecido como produto cartesiano / união cartesiana
Número de linhas na tabela A é m, Número de linhas na tabela B é n e a tabela resultante terá m * n linhas
Referência: http://datasciencemadesimple.com/sql-cross-join/
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
sempre será mais rápido do queFROM t1,t2 WHERE t1.id=t2.id
?