SQL Server: Qual é a diferença entre CROSS JOIN e FULL OUTER JOIN?

194

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?

Saajid Ismail
fonte

Respostas:

243

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 oncláusula porque você está juntando tudo a tudo.

A full outer joiné uma combinação de a left outere right outerjoin. Ele retorna todas as linhas nas duas tabelas que correspondem à wherecláusula da consulta e, nos casos em que a oncondição não pode ser satisfeita para essas linhas, ela coloca nullvalores 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.

Donnie
fonte
Então, no caso de grandes mesas FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id sempre será mais rápido do que FROM t1,t2 WHERE t1.id=t2.id?
precisa saber é o seguinte
As junções internas do @alexkovelsky geralmente são mais rápidas quando há poucas correspondências entre as duas tabelas, pois o uso de índices significa que não se incomoda em ler todas as linhas de uma das tabelas. uma junção externa completa sempre deve ler todas as linhas nas duas tabelas (ou nos índices relevantes). No caso em que os índices não são suficientes, ou um heap subjacente precisa ser lido para gerar as colunas necessárias, uma junção externa completa quase sempre é mais lenta que uma junção interna.
Andrew Hill
1
É outer joinmais rápido ou cross join?
Shafizadeh
2
@ Shafizadeh - Eles fazem coisas diferentes.
Donnie
9
E se eu me juntar totalmente ao True? o resultado / desempenho será semelhante a uma CROSS JOIN?
Arquitectónico
65

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.

user2292493
fonte
32

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.

Konstantin
fonte
2
Esses limites excluem possíveis 1-muitas correspondências? Uma junção externa completa ainda é capaz de produzir linhas (M x N).
maxwellb
1
selecione COUNT_BIG (*) DO trânsito t Destinatário CROSS JOIN r e SELECIONE COUNT_BIG (*) DO tráfego t Destinatário COMPLETO r ON (1 = 1) são os mesmos.
precisa saber é o seguinte
2
A sua é a melhor resposta real. Basicamente: a cross joinmultiplica as tabelas; a full outer joinadiciona-los no pior dos casos, dependendo de quantas linhas corresponder ..
Brian Peterson
Sim. Eu estava procurando por essa matemática - produza de MAX (M, N) a (M + N) linhas .
Arup Rakshit
1
Isto está errado. As linhas JOIN COMPLETO ON são INNER JOIN ON linhas UNION ALL linhas da tabela esquerda sem correspondência estendidas por nulo UNION ALL linhas da tabela direita sem correspondência com extensão nulas. Portanto, FULL JOIN pode retornar linhas M * N - possivelmente maiores que MAX (M, N) e M + N. Mas, de qualquer maneira, o número mínimo e máximo de linhas retornadas como uma função de M&N simplesmente não é útil . O que é útil é uma definição clara de FULL JOIN ON - em termos de INNER JOIN ON e de linhas sem correspondência.
precisa saber é
15

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

KuldipMCA
fonte
15

Para o SQL Server, CROSS JOIN and FULL OUTER JOINsão diferentes. CROSS JOINé simplesmente um produto cartesiano de duas tabelas, independentemente de qualquer critério de filtro ou condição.

FULL OUTER JOINfornece um conjunto de resultados exclusivo LEFT OUTER JOIN and RIGHT OUTER JOINde 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 a Cartesian Product number.

Número de linhas retornadas por FULL OUTER JOINigual a (Nº de linhas por LEFT OUTER JOIN) + (Nº de linhas por RIGHT OUTER JOIN) - (Nº de linhas por INNER JOIN).

Chirag
fonte
8

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
*/
rio
fonte
1
Excelente exemplo!
Lucas925
1
obrigado pelo exemplo de dados reais. isso torna mais claro.
dtc 27/05
2

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.

Sujeet
fonte
1

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)
Mo Gauvin
fonte
1

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

  • A junção externa completa do SQL também é conhecida como FULL 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/

karaimadai
fonte