Qual é a diferença entre CROSS JOIN
e INNER JOIN
?
JUNÇÃO CRUZADA:
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 é o melhor e por que eu usaria um?
sql
sql-server
sql-server-2008
tsql
cross-join
PriceCheaperton
fonte
fonte
CROSS JOIN
resultará em todas as combinações possíveis das tabelas. por exemplo, Tabela1 com 100 linhas e Tabela2 com 100 linhas resultará em 10000 registros.x CROSS JOIN y
isx INNER JOIN y ON 1=1
Respostas:
A junção cruzada não combina as linhas; se você tiver 100 linhas em cada tabela com 1 a 1 correspondência, obtém 10.000 resultados; o Innerjoin retornará apenas 100 linhas na mesma situação.
Estes 2 exemplos retornarão o mesmo resultado:
Junção cruzada
Junção interna
Use o último método
fonte
select * from table1 cross join table2 where table1.id = table2.fk_id
comoselect * from table1, table2 where table1.id = table2.fk_id
(substituindocross join
com um,
)Aqui está o melhor exemplo de junção cruzada e junção interna.
Considere as seguintes tabelas
TABELA :
Teacher
TABELA :
Student
1. INSCRIÇÃO 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
JOIN
ouINNER JOIN
eInquerir
Resultado
2. JUNÇÃO TRANSVERSAL
A junção cruzada 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 da escola e alunos, independentemente dos professores da turma, precisamos aplicar
CROSS JOIN
.Inquerir
Resultado
fonte
Cross Join
, você acha que ele não retorna todas as linhas, a menos que umaWhere
cláusula seja fornecida? De seus comentários, há mais chances de um iniciante ficar confuso !!! @philipxyCROSS JOIN = (INTERNO) JOIN = vírgula (",")
TL; DR A única diferença entre SQL CROSS JOIN, (INNER) JOIN e vírgula (",") (além de vírgula ter menor precedência para a ordem de avaliação) é que (INNER) JOIN tem ON enquanto CROSS JOIN e vírgula não.
Re produtos intermediários
Todos os três produzem um produto "Cartesiano" relacional conceitual intermediário no estilo SQL, também conhecido como junção cruzada, de todas as combinações possíveis de uma linha de cada tabela. É ON e / ou WHERE que reduz o número de linhas. SQL Fiddle
O padrão SQL define <comma> via produto (7.5 1.b.ii), <junção cruzada> via <comma> (7.7 1.a) e JOIN ON <condição de pesquisa> via <comma> mais WHERE (7.7 1.b )
Como a Wikipedia coloca:
Re OUTER JOINs e usando ON vs WHERE neles, consulte Condições em LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Por que comparar colunas entre tabelas?
Quando não há linhas duplicadas:
Toda tabela contém as linhas que fazem uma afirmação verdadeira a partir de um determinado modelo de instrução preencher em branco. (Faz uma verdadeira proposição de-- satisfaz --a certo predicado (característica) .)
Uma tabela base mantém as linhas que fazem uma declaração verdadeira de algum modelo de declaração fornecido pelo DBA:
O produto intermediário de uma junção mantém as linhas que fazem uma declaração verdadeira do AND dos modelos de seus operandos:
As condições ON e ON são ANDed para fornecer um modelo adicional. O valor são novamente as linhas que satisfazem esse modelo:
Em particular, comparar colunas para igualdade (SQL) entre tabelas significa que as linhas mantidas do produto nas partes do modelo das tabelas unidas têm o mesmo valor (não NULL) para essas colunas. É apenas coincidência que muitas linhas são normalmente removidas por comparações de igualdade entre tabelas - o que é necessário e suficiente é caracterizar as linhas que você deseja.
Basta escrever SQL para o modelo para as linhas que você deseja!
Sobre o significado de consultas (e tabelas x condições), consulte:
Como obter dados correspondentes de outra tabela SQL para duas colunas diferentes: Junção interna e / ou União?
Existe alguma regra prática para construir a consulta SQL a partir de uma descrição legível por humanos?
Sobrecarregando "junção cruzada"
Infelizmente, o termo "junção cruzada" é usado para:
Esses vários significados são confundidos. (Por exemplo, como em outras respostas e comentários aqui.)
Usando CROSS JOIN vs (INNER) JOIN vs vírgula
A convenção comum é:
Normalmente, também as condições que não estão em pares de tabelas são mantidas por um WHERE. Mas eles podem ter que ser inseridos em um (n INNER) JOIN ON para obter linhas apropriadas para o argumento de um DIREITO, ESQUERDO ou CHEIO (EXTERNO).
Re "Não use vírgula" A mistura de vírgula com JOIN explícita pode enganar, pois a vírgula tem menor precedência. Mas, dado o papel do produto intermediário no significado de CROSS JOIN, (INNER) JOIN e vírgula, os argumentos para a convenção acima de não usá-lo são instáveis. Uma junção cruzada ou vírgula é como uma junção (interna) que está em uma condição VERDADEIRA. Um produto intermediário, ON e WHERE, todos introduzem um AND no predicado correspondente. Entretanto, pode-se pensar em INNER JOIN ON - digamos, gerando uma linha de saída apenas ao encontrar um par de linhas de entrada que satisfaça a condição ON - mas, no entanto, retorna as linhas de junção cruzada que satisfazem a condição. A única razão pela qual o ON teve que suplementar vírgula no SQL foi escrever OUTERJOINs. Obviamente, uma expressão deve tornar seu significado claro; mas o que está claro depende do significado das coisas.
Diagramas de Re Venn Um diagrama de Venn com dois círculos que se cruzam pode ilustrar a diferença entre as linhas de saída para JUNÇÕES INTERNA, ESQUERDA, DIREITA e CHEIA para a mesma entrada. E quando o ON é incondicionalmente VERDADEIRO, o resultado INNER JOIN é o mesmo que CROSS JOIN. Também pode ilustrar as linhas de entrada e saída para INTERSECT, UNION & EXCEPT. E quando ambas as entradas têm as mesmas colunas, o resultado INTERSECT é o mesmo que para o SQL NATURAL JOIN padrão e o resultado EXCEPT é o mesmo que para certos idiomas que envolvem LEFT & RIGHT JOIN. Mas não ilustra como (INNER) JOIN funciona em geral. Isso parece plausível à primeira vista . Pode identificar casos especiais de peças da entrada e / ou saída parade ON, PKs (chaves primárias), FKs (chaves estrangeiras) e / ou SELECT. Tudo o que você precisa fazer é identificar quais são exatamente os elementos dos conjuntos representados pelos círculos . (Que confusa apresentações não deixam claro.) (Lembre-se que, em geral, para a junta linhas de saída têm diferentes rubricas de linhas de entrada . Mesas e SQL são sacos não conjuntos de linhas com nulos .)
fonte
CROSS JOIN
. Eu me pergunto quantas vezes alguém chega ao SQL já familiarizado com o produto cartesiano, mas incapaz de descobrirCROSS JOIN
.Junção interna
A junção que exibe apenas as linhas que têm uma correspondência nas duas tabelas unidas é conhecida como junção interna. Essa é a junção padrão na consulta e visualize o Designer.
Sintaxe para junção interna
Junção cruzada
Uma junção cruzada que produz o produto cartesiano das tabelas envolvidas na junção. 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 junção cruzada
Ou podemos escrever de outra maneira também
Agora verifique a consulta abaixo para junção cruzada
Exemplo
Ou
fonte
Lembre-se, se uma cláusula WHERE for adicionada, a junção cruzada se comportará como uma junção interna. Por exemplo, as seguintes consultas Transact-SQL produzem o mesmo conjunto de resultados. Consulte http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx
fonte
CROSS JOIN
Como expliquei neste artigo , o CROSS JOIN visa gerar um produto cartesiano.
Um Produto Cartesiano pega dois conjuntos A e B e gera todas as permutações possíveis de registros de pares a partir de dois conjuntos de dados.
Por exemplo, supondo que você tenha as seguintes tabelas
ranks
esuits
banco de dados:E o
ranks
tem as seguintes linhas:Enquanto a
suits
tabela contém os seguintes registros:Como consulta CROSS JOIN, como a seguinte:
irá gerar todas as permutações possíveis de
ranks
esuites
pares:JUNÇÃO INTERNA
Por outro lado, INNER JOIN não retorna o produto cartesiano dos dois conjuntos de dados de união.
Em vez disso, o INNER JOIN pega todos os elementos da tabela do lado esquerdo e os compara com os registros da tabela do lado direito, para que:
Por exemplo, supondo que tenhamos um relacionamento de tabela um para muitos entre as tabelas pai
post
e filho,post_comment
com a seguinte aparência:Agora, se a
post
tabela tiver os seguintes registros:e a
post_comments
tabela possui estas linhas:Uma consulta INNER JOIN como a seguinte:
incluirá todos os
post
registros, juntamente com todos os seus associadospost_comments
:Para mais detalhes sobre como o INNER JOIN funciona, consulte este artigo também.
fonte
O SQL Server também aceita a notação mais simples de:
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", existe uma única cláusula "WHERE" que executa 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.
fonte
Ao escrever consultas usando junções internas, os registros serão buscados nas duas tabelas se a condição for satisfeita nas duas tabelas, ou seja, correspondência exata da coluna comum nas duas tabelas.
Ao escrever uma consulta usando junção cruzada, o resultado é como um produto cartesiano do número de registros nas duas tabelas. exemplo, se a tabela1 contiver 2 registros e a tabela2 contiver 3 registros, o resultado da consulta será 2 * 3 = 6 registros.
Portanto, não faça junções cruzadas até precisar disso.
fonte
A junção cruzada e a junção interna são as mesmas, com a única diferença de que, na junção interna, filtramos booleanamente alguns dos resultados do produto cartesiano
É no design de nossos dados que decidimos que há apenas um caso do campo que estamos usando para a junção. Unir somente junção cruzada de ambas as tabelas e obter apenas as linhas que realizam expressão booleana especial.
Observe que, se os campos em que estamos fazendo nossas junções forem nulos nas duas tabelas, passaremos o filtro. Cabe a nós ou ao fabricante do banco de dados adicionar regras extras para evitar ou permitir nulos. Aderindo ao básico, é apenas uma junção cruzada seguida por um filtro.
fonte
A junção interna fornecerá o resultado de registros correspondentes entre duas tabelas, enquanto a junção cruzada fornece as combinações possíveis entre duas tabelas.
fonte
A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}
cross join
agir como produto cartesiano A ✖ B = {1,2}, {1,8} ..., {5,2}, {5,8}, {5,5} ..... {3,3} ..., {6,6} .... {8,9} e retornou esse longo conjunto de resultados ..ao processar
inner join
o produto através do produto cartesiano e escolher pares correspondentes. Se achar que isso ordenou os pares como chaves primárias de duas tabelas e, na pesquisa de cláusulas por A = B,inner join
escolha {5,5}, {4,4}, {6,6} , {9,9} e retornou a coluna solicitada na cláusula select relacionada a esses IDs.se
cross join
em a = b, é o mesmo resultado definido comoinner join
. nesse caso, também useinner join
.fonte
Depende da saída que você espera.
Uma junção cruzada corresponde a todas as linhas em uma tabela para todas as linhas em outra tabela. Uma junção interna corresponde a um campo ou campos. Se você tiver uma tabela com 10 linhas e outra com 10 linhas, as duas junções se comportarão de maneira diferente.
A junção cruzada terá 100 linhas retornadas e elas não serão relacionadas, exatamente o que é chamado de produto cartesiano. A junção interna corresponderá registros entre si. Supondo que um tenha uma chave primária e que seja uma chave estrangeira no outro, você receberá 10 linhas retornadas.
Uma junção cruzada tem utilidade geral limitada, mas existe para ser completa e descreve o resultado da junção de tabelas sem relações adicionadas à consulta. Você pode usar uma junção cruzada para fazer listas de combinações de palavras ou algo semelhante. Uma junção interna, por outro lado, é a junção mais comum.
fonte