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
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
Inquerir
SELECT T.TchrId,T.TeacherName,S.StudentName FROM #Teacher T INNER JOIN #Student S ON T.TchrId = S.TchrId
Resultado
x--------------------------------------x | TchrId | TeacherName | StudentName | x----------|-------------|-------------x | T1 | Mary | Vineeth | | T1 | Mary | Unni | x--------------------------------------x
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
.
Inquerir
SELECT T.TchrId,T.TeacherName,S.StudentName FROM #Teacher T CROSS JOIN #Student S
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
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:
-- rows where movie has name and ... SELECT * FROM Movies
-- rows where movie has name and ... AND customers has age and ... SELECT * FROM Customers CROSS JOIN Movies
-- 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 é:
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:
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.)
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
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.