CROSS JOIN vs INNER JOIN в SQL Server 2008

В чем разница между CROSS JOIN и 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

ВНУТРЕННЕЕ СОЕДИНЕНИЕ:

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

Какой из них лучше и почему я должен использовать один из них?

Ответ 1

Перекрестное соединение не объединяет строки, если у вас есть 100 строк в каждой таблице с совпадением 1 к 1, вы получаете 10.000 результатов, Innerjoin будет возвращать только 100 строк в той же ситуации.

Эти два примера вернут тот же результат:

Перекрестное соединение

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

Внутреннее соединение

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

Использовать последний метод

Ответ 2

Вот лучший пример Cross Join и Inner Join.

Рассмотрим следующие таблицы

ТАБЛИЦА: Teacher

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

ТАБЛИЦА: Student

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

1. INNER JOIN

Внутреннее соединение выбирает строки, которые удовлетворяют обеим таблицам. Подумайте, мы должны найти учителей, которые являются классными учителями и их соответствующими учениками. В этом условии нам нужно применить JOIN или INNER JOIN и будет

enter image description here

Query

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

Результат

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

2. CROSS JOIN

Перекрестное соединение выбирает все строки из первой таблицы и всех строк из второй таблицы и показывает как декартово произведение, т.е. со всеми возможностями

Подумайте, что мы должны найти всех учителей в школе и учениках независимо от классных учителей, нам нужно применить CROSS JOIN.

enter image description here

Query

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

Результат

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

Ответ 3

CROSS JOIN = (ВНУТРЕННИЙ) JOIN = запятая (",")

TL; DR Единственная разница между SQL CROSS JOIN, (INNER) JOIN и запятой (",") (кроме запятой, имеющей более низкий приоритет для порядка вычисления) заключается в том, что (INNER) JOIN имеет ON, а CROSS JOIN и запятую - нет.


Повторные промежуточные продукты

Все три производят промежуточный концептуальный реляционный "декартовский" продукт в стиле SQL, то есть перекрестное соединение, всех возможных комбинаций строки из каждой таблицы. Это включено и/или ГДЕ, что уменьшает количество строк. SQL Fiddle

Стандарт SQL определяет <запятую> через продукт (7.5 1.b.ii), <перекрестное соединение> через <запятую> (7.7 1.a) и JOIN ON <условие поиска> через <запятую> плюс WHERE (7.7 1.b).

Как говорит Википедия:

Перекрестное соединение

CROSS JOIN возвращает декартово произведение строк из таблиц в соединении. Другими словами, он будет производить строки, которые объединяют каждую строку из первой таблицы с каждой строкой из второй таблицы.

Внутреннее соединение

[...] Результат объединения может быть определен как результат первого взятия декартова произведения (или перекрестного объединения) всех записей в таблицах (объединение каждой записи в таблице A с каждой записью в таблице B) и затем возврата все записи, которые удовлетворяют предикату соединения.

В "неявной нотации объединения" просто перечисляются таблицы для объединения в предложении FROM оператора SELECT с использованием запятых для их разделения. Таким образом, он определяет перекрестное соединение

Re OUTER JOINs и использование ON против WHERE в них см. Условия в LEFT JOIN (ВНЕШНЕЕ СОЕДИНЕНИЕ) против INNER JOIN.

Зачем сравнивать столбцы между таблицами?

Когда нет повторяющихся строк:

Каждая таблица содержит строки, которые составляют истинный оператор из определенного шаблона оператора заполнения "[named-]". (Это делает истинное предложение из - удовлетворяет - некоторому (характерному) предикату.)

  • Базовая таблица содержит строки, которые делают истинный оператор из некоторого заданного DBA шаблона оператора:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • Промежуточный продукт соединения содержит строки, которые делают истинное утверждение из AND шаблонов своих операндов:

    /* 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 условия AND, чтобы дать дополнительный шаблон. Значение снова строки, которые удовлетворяют этому шаблону:

    /* 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 INNER JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18
    

В частности, сравнение столбцов для (SQL) равенства между таблицами означает, что строки, хранящиеся в продукте из частей шаблона объединенных таблиц, имеют одинаковое (не NULL) значение для этих столбцов. Это просто совпадение, что многие строки обычно удаляются путем сравнения на равенство между таблицами - что необходимо и достаточно для характеристики нужных вам строк.

Просто напишите SQL для шаблона для строк, которые вы хотите!

О значении запросов (и таблиц и условий) смотрите:
Как получить совпадающие данные из другой таблицы SQL для двух разных столбцов: Inner Join и/или Union?
Есть ли эмпирическое правило для построения SQL-запроса из понятного человеку описания?

Перегрузка "перекрестное соединение"

К сожалению, термин "перекрестное соединение" используется для:

  • Промежуточный продукт.
  • CROSS JOIN.
  • (ВНУТРЕННИЙ) СОЕДИНИТЕ с ON или WHERE, который не сравнивает столбцы из одной таблицы с столбцами другой. (Так как это имеет тенденцию возвращать так много промежуточных строк продукта.)

Эти различные значения смешиваются. (Например, как в других ответах и комментариях здесь.)

Использование CROSS JOIN против (INNER) JOIN против запятой

Общее соглашение:

  • Используйте CROSS JOIN тогда и только тогда, когда вы не сравниваете столбцы между таблицами. Это означает, что отсутствие сравнений было преднамеренным.
  • Используйте (INNER) JOIN с ON тогда и только тогда, когда вы сравниваете столбцы между таблицами. (Плюс, возможно, другие условия.)
  • Не используйте запятую.

Как правило, условия не для пар таблиц сохраняются для WHERE. Но их, возможно, придется поместить в (n INNER) JOIN ON, чтобы получить соответствующие строки для аргумента RIGHT, LEFT или FULL (OUTER) JOIN.

Re "Не используйте запятую" Смешивание запятой с явным JOIN может ввести в заблуждение, потому что запятая имеет меньший приоритет. Но, учитывая роль промежуточного продукта в значении CROSS JOIN, (INNER) JOIN и запятой, аргументы для соглашения выше о том, что он вообще не используется, шатки. Перекрестное соединение или запятая аналогично (ВНУТРЕННЕМУ) СОЕДИНЕНИЮ, имеющему условие ИСТИНА. Промежуточный продукт, ON и WHERE, все вводят AND в соответствующем предикате. Однако иначе можно думать о INNER JOIN ON - скажем, о создании выходной строки только при поиске пары входных строк, удовлетворяющих условию ON - тем не менее она возвращает строки перекрестного соединения, которые удовлетворяют условию. Единственная причина, по которой ON должен был дополнить запятую в SQL, заключалась в написании OUTER JOIN. Конечно, выражение должно прояснить его значение; но то, что ясно, зависит от того, что вещи означают.

Диаграммы Венна Диаграмма Венна с двумя пересекающимися кругами может иллюстрировать разницу между выходными строками для INNER, LEFT, RIGHT & FULL JOIN для одного и того же входа. И когда ВКЛЮЧЕНО, безусловно, ИСТИНА, результат ВНУТРЕННЕГО СОЕДИНЕНИЯ такой же, как ВРЕМЕННОЕ СОЕДИНЕНИЕ Также он может иллюстрировать строки ввода и вывода для INTERSECT, UNION и EXCEPT. И когда оба входа имеют одинаковые столбцы, результат INTERSECT такой же, как для стандартного SQL NATURAL JOIN, а результат EXCEPT такой же, как для некоторых идиом, включающих LEFT & RIGHT JOIN. Но это не иллюстрирует, как (INNER) JOIN работает в целом. На первый взгляд это кажется правдоподобным. Он может идентифицировать части ввода и/или вывода для особых случаев ON, PK (первичные ключи), FK (внешние ключи) и/или SELECT. Все, что вам нужно сделать, чтобы увидеть это, это определить, какие именно элементы наборов представлены кружками. (Какие запутанные представления никогда не проясняются.) (Помните, что обычно для выходных строк объединений заголовки отличаются от входных строк. А таблицы SQL - это пакеты, а не наборы строк с NULL.)

Ответ 4

Внутреннее соединение

Соединение, которое отображает только строки, которые имеют совпадение в соединенных таблицах, называется внутренним соединением. Это соединение по умолчанию в конструкторе запросов и представлений.

Синтаксис для внутренней регистрации

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

Перекрестная связь

Перекрестное соединение, которое производит декартово произведение таблиц, участвующих в объединении. Размер декартова произведения - это число строк в первой таблице, умноженное на количество строк во второй таблице.

Синтаксис для Cross Join

SELECT * FROM table_name1
CROSS JOIN table_name2

Или мы можем записать это по-другому также

SELECT * FROM table_name1,table_name2

Теперь проверьте запрос ниже для Cross join

Пример

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

или

SELECT * FROM UserDetails, OrderDetails

Ответ 5

Помните, что если добавлено предложение WHERE, кросс-соединение ведет себя как внутреннее соединение. Например, следующие запросы Transact-SQL создают один и тот же набор результатов. См. http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx

Ответ 6

SQL Server также принимает более простые обозначения:

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

Используя эту более простую нотацию, вам не нужно беспокоиться о различии между внутренними и кросс-соединениями. Вместо двух предложений "ON" существует одно предложение WHERE, которое выполняет задание. Если у вас возникли трудности с выяснением того, какие положения "ПРИСОЕДИНЯЙТЕСЬ" "ON" отправляются туда, отмените нотацию "JOIN" и используйте более простой вариант выше.

Это не обман.

Ответ 7

Кросс-соединение и внутреннее соединение одинаковы с той лишь разницей, что во внутреннем соединении мы булево фильтруем некоторые результаты декартова произведения

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

Именно по дизайну наших данных мы решаем, что есть только один случай поля, которое мы используем для соединения. Присоединяйтесь только к перекрестному объединению обеих таблиц и получите только строки, выполняющие специальное булевское выражение.

Обратите внимание, что если поля, которые мы делаем, объединяются, будут пустыми в обеих таблицах, мы передадим фильтр. Нам или изготовителю базы данных приходится добавлять дополнительные правила, чтобы избежать или разрешить нули. Соблюдая основы, это просто крест-соединение, за которым следует фильтр.

Ответ 8

При написании запросов с использованием внутренних объединений записи будут извлекаться из обеих таблиц, если условие выполняется в обеих таблицах, то есть точное совпадение общего столбца в обеих таблицах.

При написании запроса с использованием перекрестного соединения результат подобен декартовому произведению без записей в обеих таблицах. пример, если таблица1 содержит 2 записи, а таблица2 содержит 3 записи, тогда результат запроса - 2 * 3 = 6 записей.

Так что не переходите на крест-соединение, пока вам это не понадобится.

Ответ 9

Вы можете просто Select * from table1, table2

Ответ 10

Внутреннее соединение даст результат согласованных записей между двумя таблицами, где в качестве перекрестного соединения вы получите возможные комбинации между двумя таблицами.