CROSS JOIN vs INNER JOIN no SQL Server 2008

Qual é a diferença entre o CROSS JOIN e o INNER JOIN ?

CROSS JOIN:

 SELECT Movies.CustomerID, Movies.Movie, Customers.Age, Customers.Gender, Customers.[Education Level], Customers.[Internet Connection], Customers.[Marital Status], FROM Customers CROSS JOIN Movies 

JUNÇÃO INTERNA:

 SELECT Movies.CustomerID, Movies.Movie, Customers.Age, Customers.Gender, Customers.[Education Level], Customers.[Internet Connection], Customers.[Marital Status] FROM Customers INNER JOIN Movies ON Customers.CustomerID = Movies.CustomerID 

Qual deles é melhor e por que eu usaria um deles?

A união cruzada não combina as linhas, se você tiver 100 linhas em cada tabela com correspondência de 1 para 1, obterá 10.000 resultados, o Innerjoin retornará apenas 100 linhas na mesma situação.

Estes 2 exemplos retornarão o mesmo resultado:

Cruzar junit

 select * from table1 cross join table2 where table1.id = table2.fk_id 

Junção interna

 select * from table1 join table2 on table1.id = table2.fk_id 

Use o último método

Aqui está o melhor exemplo de Cross Join e Inner Join.

Considere as seguintes tabelas

TABELA: Teacher

 x------------------------x | TchrId | TeacherName | x----------|-------------x | T1 | Mary | | T2 | Jim | x------------------------x 

TABELA: Student

 x--------------------------------------x | StudId | TchrId | StudentName | x----------|-------------|-------------x | S1 | T1 | Vineeth | | S2 | T1 | Unni | x--------------------------------------x 

1. JUNTA INTERNA

Junção interna seleciona as linhas que satisfazem a tabela .

Considere que precisamos encontrar os professores que são professores e seus alunos correspondentes. Nessa condição, precisamos aplicar o JOIN ou o INNER JOIN e

insira a descrição da imagem aqui

Inquerir

 SELECT T.TchrId,T.TeacherName,S.StudentName FROM #Teacher T INNER JOIN #Student S ON T.TchrId = S.TchrId 
  • SQL FIDDLE

Resultado

 x--------------------------------------x | TchrId | TeacherName | StudentName | x----------|-------------|-------------x | T1 | Mary | Vineeth | | T1 | Mary | Unni | x--------------------------------------x 

2. CROSS JOIN

Cross join seleciona todas as linhas da primeira tabela e todas as linhas da segunda tabela e mostra como produto cartesiano ou seja, com todas as possibilidades

Considere que precisamos encontrar todos os professores na escola e os alunos, independentemente dos professores da turma, precisamos aplicar o CROSS JOIN .

insira a descrição da imagem aqui

Inquerir

 SELECT T.TchrId,T.TeacherName,S.StudentName FROM #Teacher T CROSS JOIN #Student S 
  • SQL FIDDLE

Resultado

 x--------------------------------------x | TchrId | TeacherName | StudentName | x----------|-------------|-------------x | T2 | Jim | Vineeth | | T2 | Jim | Unni | | T1 | Mary | Vineeth | | T1 | Mary | Unni | x--------------------------------------x 

CROSS JOIN = (INNER) JOIN = vírgula (“,”)

TL; DR A única diferença entre CROSS JOIN, SQL (INNER) JOIN e “,” (além de vírgula ter menor precedência para a ordem de avaliação) é que (INNER) JOIN tem um ON enquanto CROSS JOIN e vírgula não.


Re produtos intermediários cruzados

Todos os três produzem um produto cruzado cartesiano de estilo SQL conceitual intermediário de todas as combinações possíveis de uma linha de cada tabela. É ON e / ou ONDE isso reduz o número de linhas. Violino SQL

O padrão SQL define via produto cruzado (7.5 1.b.ii), via (7.7 1.a) e JOIN ON via mais WHERE (7.7 1. b).

Como a Wikipedia coloca:

Cruzar junit

CROSS JOIN retorna o produto cartesiano de linhas das tabelas na associação. Em outras palavras, ele produzirá linhas que combinam cada linha da primeira tabela com cada linha da segunda tabela.

Junção interna

[…] O resultado da junit pode ser definido como o resultado de primeiro pegar o produto cartesiano (ou Cruzada) de todos os registros nas tabelas (combinando cada registro na tabela A com cada registro na tabela B) e depois retornar todos os registros que satisfazem o predicado de junit.

A “notação de junit implícita” simplesmente lista as tabelas para unir, na cláusula FROM da instrução SELECT, usando vírgulas para separá-las. Assim, especifica uma junit cruzada

Re OUTER JOINs & ON vs ONDE veja isto .

Por que comparar colunas entre tabelas?

Cada tabela contém as linhas que fazem uma certa declaração fill-in-the- [named-] blanks true:

  • Uma tabela base contém as linhas que fazem com que alguma instrução fornecida pelo DBA seja verdadeira.
 -- rows where movie  has name  and ... SELECT * FROM Movies 
  • O produto intermediário intermediário de uma junit contém as linhas que satisfazem a instrução que é a AND das instruções de seus operandos.
  -- rows where movie  has name  and ... AND customers  has age  and ... SELECT * FROM Customers CROSS JOIN Movies 
  • ON e ON onde as condições são ANDed para dar uma declaração adicional. O valor é novamente as linhas que satisfazem essa instrução.
 -- rows where movie  has name  and ... AND customer  has age  and ... AND  =  AND  >=  AND  = 18 SELECT * FROM Movies JOIN Customers ON Customers.CustomerID = Movies.CustomerID AND Customers.CustomerAge >= Movies.MinimumAge WHERE Customers.Age = 18 

Em particular, comparar colunas para igualdade entre tabelas significa que as partes das tabelas unidas da instrução têm o mesmo valor para essas colunas. É apenas coincidência que muitas linhas são normalmente removidas por comparações de igualdade entre tabelas.

Basta escrever SQL para a instrução das linhas que você deseja!

Re o significado de consultas (e tabelas vs condições) ver isso .

Usando CROSS JOIN vs (INNER) JOIN vs vírgula

A convenção comum é:

  • Use CROSS JOIN quando e somente quando você não comparar colunas entre tabelas. Isso sugere que a falta de comparações foi intencional.
  • Use (INNER) JOIN com ON quando e somente quando tiver comparações entre tabelas (e possivelmente outras comparações).
  • Não use vírgula.

Normalmente também comparações não entre tabelas são mantidas para um WHERE. Mas eles podem ter que ser colocados em um (INNER) JOIN ON para obter linhas apropriadas para o argumento para um JOIN DIREITO, ESQUERDO ou CHEIO (EXTERNO).

Sobrecarga “cross join”

Infelizmente, o termo “cross join” é usado para:

  • o produto transversal intermediário
  • CROSS JOIN
  • unindo-se sem um ON ou WHERE que compara qualquer coluna (s) de uma tabela a qualquer coluna (s) de outra (desde que tende a retornar tantas linhas intermediárias de produtos cruzados)

Esses vários significados se confundem. (Por exemplo, como em outras respostas e comentários aqui.)

PS Dado o papel do produto intermediário cruzado no significado de CROSS JOIN, (INNER) JOIN e vírgula, os argumentos para a convenção acima são instáveis. Um CROSS JOIN ou uma vírgula é como um JOIN (INNER) que está em uma condição VERDADEIRA. Um produto intermediário cruzado, ON e WHERE, todos introduzem um AND no predicado correspondente. No entanto, mais INNER JOIN “gera correspondências em” uma condição, apenas mantém linhas que atendem a uma condição. A única razão pela qual a ON precisava suplementar a vírgula no SQL era escrever OUTER JOINs. Naturalmente, uma expressão deve esclarecer seu significado; mas clareza é relativa a um entendimento particular.)

Junção interna

A união que exibe apenas as linhas que possuem uma correspondência nas duas tabelas unidas é conhecida como união interna. Esta é a junit padrão na consulta e exibição do Designer.

Sintaxe para junit interna

 SELECT t1.column_name,t2.column_name FROM table_name1 t1 INNER JOIN table_name2 t2 ON t1.column_name=t2.column_name 

Cruzar Junta

Uma união cruzada que produz um produto cartesiano das tabelas envolvidas na junit. O tamanho de um produto cartesiano é o número de linhas na primeira tabela multiplicado pelo número de linhas na segunda tabela.

Sintaxe para junit cruzada

 SELECT * FROM table_name1 CROSS JOIN table_name2 

Ou podemos escrever de outra maneira também

 SELECT * FROM table_name1,table_name2 

Agora, verifique a consulta abaixo para Cruzar.

Exemplo

 SELECT * FROM UserDetails CROSS JOIN OrderDetails 

Ou

 SELECT * FROM UserDetails, OrderDetails 

Lembre-se, se uma cláusula WHERE for adicionada, a junit cruzada se comportará como uma junit interna. Por exemplo, as seguintes consultas Transact-SQL produzem o mesmo conjunto de resultados. Por favor, consulte http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx

O SQL Server também aceita a notação mais simples de:

 SELECT AF, BG, CH FROM TABLE_A A, TABLE_B B, TABLE_C C WHERE AX = BX AND BY = CY 

Usando essa notação mais simples, não é necessário se preocupar com a diferença entre junções internas e cruzadas. Em vez de duas cláusulas “ON”, há uma única cláusula “WHERE” que faz o trabalho. Se você tiver alguma dificuldade em descobrir quais cláusulas “JOIN” “ON” vão para onde, abandone a notação “JOIN” e use a mais simples acima.

Não é trapaça.

Ao gravar consultas usando associações internas, os registros buscarão as duas tabelas se a condição estiver satisfeita nas duas tabelas, ou seja, correspondência exata da coluna comum em ambas as tabelas.

Ao escrever a consulta usando união cruzada, o resultado é como um produto cartesiano do número de registros nas duas tabelas. exemplo, se table1 contiver 2 registros e table2 contiver 3 registros, o resultado da consulta será 2 * 3 = 6 registros.

Então não vá para cross join até que você precise disso.

Junção cruzada e junit interna são as mesmas com a única diferença de que na junit interna filtramos de forma booleana alguns dos resultados do produto cartesiano

 table1 x--------------------------------------x | fieldA | fieldB | fieldC | x----------|-------------|-------------x | A | B | option1 | | A | B1 | option2 | x--------------------------------------x table2 x--------------------------------------x | fieldA | fieldB | fieldC | x----------|-------------|-------------x | A | B | optionB1 | | A1 | B1 | optionB2 | x--------------------------------------x cross join A,B,option1,A,B,optionB1 A,B,option1,A1,B1,optionB2 A,B1,option2,A,B,optionB1 A,B1,option2,A1,B1,optionB2 inner join on field1 (only with the value is the same in both tables) A,B,option1,A,B,optionB1 A,B1,option2,A,B,optionB1 inner join on field1 A,B,option1,A,B,optionB1 

É no design dos nossos dados que decidimos que há apenas um caso do campo que estamos usando para a junit. Junte-se apenas cruzar juntar ambas as tabelas e obter apenas as linhas que realizam expressão booleana especial.

Observe que, se os campos em que estamos realizando nossas Joins on forem nulos nas duas tabelas, passaremos o filtro. Cabe a nós ou ao fabricante do database adicionar regras extras para evitar ou permitir nulos. Aderindo ao básico, é apenas uma união cruzada seguida por um filtro.

A junit interna dará o resultado de registros combinados entre duas tabelas onde a junit cruzada fornece as combinações possíveis entre duas tabelas.

O SQL CROSS JOIN produz um conjunto de resultados que é o número de linhas na primeira tabela multiplicado pelo número de linhas na segunda tabela se nenhuma cláusula WHERE for usada junto com CROSS JOIN. Esse tipo de resultado é chamado de Produto Cartesiano.

Se a cláusula WHERE for usada com o CROSS JOIN, ela funcionará como um INNER JOIN.