Junção cruzada vs junção interna no servidor SQL 2008

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 INTERIOR:

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 porque usaria qualquer um?

Author: Steven, 2013-07-20

10 answers

A junção cruzada não combina as linhas, se você tiver 100 linhas em cada tabela com 1 Para 1 jogo, você obtém 10.000 resultados, Innerjoin só irá retornar 100 linhas na mesma situação.

Estes 2 Exemplos Irão devolver o mesmo resultado:

Junção cruzada

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

Junta interna

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

Utilize o último método

 100
Author: t-clausen.dk, 2013-07-20 07:16:00
Aqui está o melhor exemplo de junção cruzada e junção interior.

Considere os quadros seguintes

Quadro : Teacher

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

Quadro : Student

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

1. JUNTA INTERNA

O elemento interior selecciona as linhas que satisfazem tanto a tabela .

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

enter image description here

Pesquisa

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

2. JUNÇÃO CRUZADA

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

Consideremos que precisamos encontrar todos os professores na escola e alunos independentemente de professores de classe, precisamos de aplicar CROSS JOIN.

enter image description here

Pesquisa

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
 155
Author: Sarath Avanavu, 2017-08-29 12:52:39

= = Ligações externas = = (",")

TL; DR a única diferença entre a junção cruzada SQL, a junção (interior) e a vírgula (",") (Além de vírgula ter precedência menor para a ordem de avaliação) é que a junção (interior) tem uma junção Cruz e vírgula Não.


Re produtos intermédios

Todos os três produzem um intermediário conceitual SQL-estilo relacional "cartesiano" produto "Cruz" de todas as combinações possíveis de uma linha de cada tabela. Está ligado e / ou onde isso reduz o número de linhas. Violino SQL

A norma SQL define através do produto (7, 5 1.B. ii), via (7.7 1.a) e juntar em via Mais ONDE (7.7 1.B).

Como diz a Wikipédia:

Junção cruzada

A junção cruzada devolve o produto cartesiano das linhas das tabelas da junção. Em outras palavras, ele irá produzir linhas que combinam cada linha de a primeira mesa com cada linha da segunda mesa.

Junção Interior

[...] O resultado da junção pode ser definido como o resultado de primeiro tomar o produto cartesiano (ou junção cruzada) de todos os registros nas tabelas (combinando cada registro na tabela a com cada registro na tabela B) e, em seguida, retornar todos os registros que satisfazem o predicado da junção.

A "notação de junção implícita" simplesmente lista as tabelas para aderir, na cláusula FROM da instrução SELECT, usando vírgulas para separá-los. Assim, especifica uma junção cruzada

Verjuntas exteriores vs onde nelas veras condições na junção esquerda (junção exterior) vs junção interior .

Porquê comparar colunas entre tabelas?

Cada tabela contém as linhas que fazem uma declaração verdadeira a partir de um determinado modelo de declaração de preenchimento-em-[nome -]. (Faz uma proposição verdadeira de--satisfaz -- um certo (característica) predicado .)

  • Uma tabela de base contém as linhas que fazem uma declaração verdadeira a partir de um modelo de declaração dada pelo DBA:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • O produto intermédio de uma junção contém as linhas que fazem uma verdadeira declaração a partir dos e dos modelos dos seus operandos:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    */
    FROM Customers C CROSS JOIN Movies M
    
  • ON & WHERE conditions are ANDed in to give a further template. O valor é novamente as linhas que satisfazem modelo:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    AND C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    AND C.Age = 18
    */
    FROM Customers C CROSS JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18
    

Em particular, comparar colunas para a igualdade entre tabelas significa que as linhas mantidas do produto das partes das tabelas unidas do modelo têm o mesmo valor para essas colunas. É apenas coincidência que muitas linhas são tipicamente 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 deseja!

Re o Significado de consultas (e tabelas vs Condições) ver:
Como obter dados correspondentes de outra tabela SQL para duas colunas diferentes: junção interna e/ou União?
existe alguma regra de ouro para construir a consulta SQL a partir de uma descrição legível pelo homem?

Sobrecarga "junção cruzada"

Infelizmente, o termo "cross join" é usado para:
  • o produto intermédio.
  • JUNTA-TE AO CROSS. [[70]}(interior) Junte-se com um ON ou onde isso não compare quaisquer colunas de uma tabela a quaisquer colunas de outra. (Uma vez que isso tende a retornar muitas das linhas de produto intermediário.)

Utilizar junção cruzada vs junção interna vs vírgula

A convenção comum é:

  • Use a junção cruzada quando e apenas quando não comparar colunas entre tabelas. Isto para mostrar que a falta de comparações foi intencional.
  • Use (interior) Junte-se ao ON quando e apenas quando comparar colunas entre tabelas (mais possivelmente outras condições.)
  • Não uses vírgula.

Normalmente também as condições que não estão em pares de tabelas são mantidas para um "WHERE". Mas eles podem ter que ser colocados em uma junção(N interior) para obter linhas apropriadas para o argumento para uma junção direita, esquerda ou completa (exterior).

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

Re "Don'T use vírgula" a mistura de vírgula Com junção explict pode induzir em erro porque a vírgula tem precedência menor. Mas dado o papel do produto intermédio No significado de junção cruzada, junção (interna) e vírgula, Os argumentos para a Convenção acima de não usá-lo em tudo são tremidos. Uma junção cruzada ou vírgula É como uma junção (interior) que está em uma condição verdadeira. Um produto intermédio, EM e onde todos introduzem um e no predicado correspondente. No entanto, pode-se pensar em--say, gerar uma linha de saída apenas quando se encontra um par de linhas de entrada que satisfaz a condição--it no entanto, retorna as linhas de junção cruzadas que satisfazem a condição. A única razão em tinha para completar vírgula em SQL era escreverjuntas externas . É claro que uma expressão deve deixar claro o seu significado; mas o que é claro depende do significado das coisas.

Re diagramas de Venn Um diagrama de Venn com dois círculos secantes pode ilustrar a diferença entre saída de linhas para a rede INTERNA, ESQUERDA, DIREITA E Associações para a mesma entrada. E quando ON é incondicionalmente verdadeiro, o resultado da junção interior é o mesmo que a junção cruzada. 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 a junção NATURAL SQL padrão. Mas isso não ilustra como a União (interior) funciona em geral. Parece plausível à primeira vista. Pode identificar algumas partes {[23] } de entrada e / ou saída para casos especiais de ON, PKs( chaves primárias), FKs (chaves estrangeiras) e/ou seleccionar. Tudo que você tem que fazer para ver isso é identificar quais são exatamente as restrições e quais são exatamente os elementos dos conjuntos representados pelos círculos. (Que nesses casos especiais re partes nunca é clarificado.) (Lembre-se que em geral as linhas de saída têm diferentes títulos das linhas de entrada.)

 47
Author: philipxy, 2018-10-03 10:42:04

Junta Interna

A junção que mostra apenas as linhas que têm uma correspondência em ambas as tabelas unidas é conhecida como junção interna. Esta é a junção padrão na consulta e desenhador de vistas.

Sintaxe para junção interna

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

Junção Cruzada

Uma junção cruzada que produz um produto cartesiano das tabelas que participaram 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 a junção cruzada

SELECT * FROM table_name1
CROSS JOIN table_name2
Ou podemos escrevê-lo de outra forma.
SELECT * FROM table_name1,table_name2

Agora verifique a pesquisa abaixo para a junção cruzada

Exemplo

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

Ou

SELECT * FROM UserDetails, OrderDetails
 22
Author: kavitha Reddy, 2014-06-11 23:08:08

Por favor, lembre-se, se uma cláusula onde é adicionada, a junção cruzada comporta-se como uma junção interior. 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

 10
Author: user3095896, 2014-03-12 13:51:01

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

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

Usando esta notação mais simples, não é preciso preocupar-se com a diferença entre as juntas internas e cruzadas. Em vez de duas cláusulas "ON", há uma única cláusula" onde " que faz o trabalho. Se você tiver alguma dificuldade em descobrir quais as cláusulas" juntar "em" ir para onde, abandonar a notação" juntar " e usar a mais simples acima.

Não é batota.
 6
Author: David F Mayer, 2014-08-26 16:24:53

Ao escrever as consultas usando Ligações internas, os registos serão obtidos de ambas as tabelas se a condição for satisfeita em ambas as tabelas, ou seja, a correspondência exacta da coluna comum em ambas as tabelas.

Ao escrever a consulta usando a junção cruzada, o resultado é como o produto cartesiano do no de registros em ambas as tabelas. exemplo se table1 contém 2 registros e table2 contém 3 registros então o resultado da consulta é 2*3 = 6 registros.

Por isso não vás para a cross join até que precises disso.
 2
Author: Jagadeesh G, 2013-07-21 04:58:48

A junção cruzada e a junção interior são as mesmas, com a única diferença de que na junção interior filtramos booleanly 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 desenho dos nossos dados que decidimos que só há um caso do campo que estamos a usar para a junção. Junte-se apenas cruzar juntar as duas tabelas e obter apenas as linhas que realizam uma expressão booleana especial.

Note que se os campos em que estamos a fazer as nossas juntas fossem nulos em ambas as tabelas, passaríamos o filtro. Cabe a nós ou ao fabricante do banco de dados adicionar regras extras para evitar ou permitir nulls. Aderindo ao básico é apenas uma junção cruzada seguida de um filtro.

 2
Author: Javier Bañez, 2016-02-05 11:23:26

A junção interna dará o resultado de registos correspondentes entre duas tabelas onde, à medida que a junção cruzada lhe dá as possíveis combinações entre duas tabelas.

 0
Author: sindhu, 2016-02-04 16:58:35

A junção cruzada SQL produz um conjunto de resultados que é o número de linhas na primeira tabela multiplicado pelo número de linhas na segunda tabela, se não for utilizada a cláusula onde, juntamente com a junção cruzada.Este tipo de resultado é chamado de produto cartesiano.

Se onde a cláusula é usada com junção cruzada, ela funciona como uma junção interna.

 0
Author: shahadul, 2018-06-05 08:05:18