В чем разница между 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
Какой из них лучше, и почему я должен использовать любой из них?
sql
sql-server
sql-server-2008
tsql
cross-join
PriceCheaperton
источник
источник
CROSS JOIN
приведет ко всем возможным комбинациям таблиц. например, Table1 со 100 строками и Table2 со 100 строками приведут к 10000 записям.x CROSS JOIN y
этоx INNER JOIN y ON 1=1
Ответы:
Перекрестное объединение не объединяет строки, если в каждой таблице 100 строк с соответствием 1 к 1, вы получите 10.000 результатов, Innerjoin вернет только 100 строк в той же ситуации.
Эти 2 примера вернут один и тот же результат:
Перекрестное соединение
Внутреннее соединение
Используйте последний метод
источник
select * from table1 cross join table2 where table1.id = table2.fk_id
какselect * from table1, table2 where table1.id = table2.fk_id
(заменаcross join
на,
)Вот лучший пример Cross Join и Inner Join.
Рассмотрим следующие таблицы
СТОЛ :
Teacher
СТОЛ :
Student
1. ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Внутреннее объединение выбирает строки, которые удовлетворяют обеим таблицам .
Подумайте, нам нужно найти учителей, которые являются классными учителями, и их соответствующих учеников. В этом случае нам нужно подать заявку
JOIN
илиINNER JOIN
и будетзапрос
результат
2. CROSS JOIN
Перекрестное объединение выбирает все строки из первой таблицы и все строки из второй таблицы и отображается как декартово произведение, т. Е. Со всеми возможностями.
Рассмотрим, что нам нужно найти всех учителей в школе и учеников независимо от классных учителей, нам нужно подать заявку
CROSS JOIN
,запрос
результат
источник
Cross Join
, как вы думаете, он не возвращает все строки, еслиWhere
не дано предложение? Из ваших комментариев, у новичка больше шансов запутаться !!! @philipxyCROSS 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 ).
Как говорит Википедия:
Re OUTER JOINs и использование ON против ГДЕ в них см. Условия в LEFT JOIN (ВНЕШНЕЕ СОЕДИНЕНИЕ) против INNER JOIN .
Зачем сравнивать столбцы между таблицами?
Когда нет повторяющихся строк:
Каждая таблица содержит строки, которые составляют истинный оператор из определенного шаблона оператора заполнения-заполненных-именованных-бланков. (Это делает истинное предложение из - удовлетворяет - определенный (характерный) предикат .)
Базовая таблица содержит строки, которые делают истинный оператор из некоторого заданного DBA шаблона оператора:
Промежуточный продукт объединения содержит строки, которые делают истинное утверждение из AND шаблонов его операндов:
ON & WHERE условия AND, чтобы дать дополнительный шаблон. Значение снова строки, которые удовлетворяют этому шаблону:
В частности, сравнение столбцов для (SQL) равенства между таблицами означает, что строки, хранящиеся в продукте из частей шаблона объединенных таблиц, имеют одинаковое (не NULL) значение для этих столбцов. Это просто совпадение, что многие строки обычно удаляются путем сравнения на равенство между таблицами - что необходимо и достаточно для характеристики нужных вам строк.
Просто напишите SQL для шаблона для строк, которые вы хотите!
Значение запросов (и таблиц и условий) см. В разделе:
Как получить совпадающие данные из другой таблицы SQL для двух разных столбцов: Inner Join и / или Union?
Есть ли эмпирическое правило для построения SQL-запроса из понятного человеку описания?
Перегрузка "перекрестное соединение"
К сожалению, термин «перекрестное соединение» используется для:
Эти различные значения смешиваются. (Например, как в других ответах и комментариях здесь.)
Использование CROSS JOIN против (INNER) JOIN против запятой
Общее соглашение:
Как правило, условия не для пар таблиц сохраняются для 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Соединения. Конечно, выражение должно прояснить его значение; но то, что ясно, зависит от того, что вещи означают.
Диаграммы Венна Диаграмма Венна с двумя пересекающимися кругами может иллюстрировать разницу между выходными строками для INNER, LEFT, RIGHT & FULL JOIN для одного и того же входа. И когда ВКЛЮЧЕНО, безусловно, ИСТИНА, результат ВНУТРЕННЕГО СОЕДИНЕНИЯ такой же, как ВРЕМЕННОЕ СОЕДИНЕНИЕ. Также он может иллюстрировать строки ввода и вывода для INTERSECT, UNION и EXCEPT. И когда оба входа имеют одинаковые столбцы, результат INTERSECT такой же, как для стандартного SQL NATURAL JOIN, а результат EXCEPT такой же, как для некоторых идиом, включающих LEFT & RIGHT JOIN. Но это не иллюстрирует, как (INNER) JOIN работает в целом. На первый взгляд это кажется правдоподобным . Он может определить детали ввода и / или вывода дляособые случаиON, PK (первичные ключи), FK (внешние ключи) и / или SELECT. Все, что вам нужно сделать, чтобы увидеть это, это определить, какие именно элементы наборов представлены кружками . (Какие запутанные представления никогда не проясняются.) (Помните, что обычно для выходных строк объединений заголовки отличаются от входных строк . А таблицы SQL - это пакеты, а не наборы строк с NULL .)
источник
CROSS JOIN
. Мне интересно, как часто кто-то приходит к SQL, уже знакомому с декартовым продуктом, но не в состоянии понятьCROSS JOIN
.Внутреннее соединение
Объединение, в котором отображаются только строки, совпадающие в обеих объединенных таблицах, называется внутренним объединением. Это объединение по умолчанию в запросе и просмотр конструктора.
Синтаксис для внутреннего присоединения
Перекрестное соединение
Перекрестное соединение, которое производит декартово произведение таблиц, которые участвуют в объединении. Размер декартового произведения - это число строк в первой таблице, умноженное на количество строк во второй таблице.
Синтаксис для перекрестного соединения
Или мы можем написать это также по-другому
Теперь проверьте запрос ниже для перекрестного соединения
пример
Или
источник
Помните, что если добавлено предложение WHERE, перекрестное соединение ведет себя как внутреннее соединение. Например, следующие запросы Transact-SQL дают одинаковый набор результатов. Пожалуйста, обратитесь к http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx
источник
CROSS JOIN
Как я объяснил в этой статье , CROSS JOIN предназначен для создания декартового произведения.
Декартово произведение берет два набора A и B и генерирует все возможные перестановки парных записей из двух заданных наборов данных.
Например, если у вас есть следующие
ranks
иsuits
таблицы базы данных:И
ranks
имеет следующие строки:При этом
suits
таблица содержит следующие записи:Как CROSS JOIN запрос, как следующий:
сгенерирует все возможные перестановки
ranks
иsuites
пар:ВНУТРЕННЕЕ СОЕДИНЕНИЕ
С другой стороны, INNER JOIN не возвращает декартово произведение двух объединяемых наборов данных.
Вместо этого INNER JOIN берет все элементы из левой таблицы и сопоставляет их с записями в правой таблице так, чтобы:
Например, предположим, что у нас есть отношение таблицы «один ко многим» между родительской
post
и дочернейpost_comment
таблицами, которые выглядят следующим образом:Теперь, если в
post
таблице есть следующие записи:и
post_comments
таблица имеет эти строки:ВНУТРЕННИЙ запрос JOIN, как следующий:
собирается включить все
post
записи вместе со всеми связанными с нимиpost_comments
:Подробнее о том, как работает INNER JOIN, читайте в этой статье .
источник
SQL Server также принимает более простую запись:
Используя эту более простую нотацию, не нужно беспокоиться о разнице между внутренними и перекрестными соединениями. Вместо двух предложений «ON» есть одно предложение «WHERE», которое выполняет эту работу. Если у вас возникнут трудности с определением, куда и куда идут предложения «JOIN», «ON», оставьте нотацию «JOIN» и используйте более простую приведенную выше.
Это не обман.
источник
При написании запросов с использованием внутренних объединений записи будут извлекаться из обеих таблиц, если выполняется условие для обеих таблиц, т.е. точное совпадение общего столбца в обеих таблицах.
При написании запроса с использованием кросс-соединения результат выглядит как декартово произведение числа записей в обеих таблицах. Например, если table1 содержит 2 записи, а table2 содержит 3 записи, результат запроса будет 2 * 3 = 6 записей.
Так что не переходите на перекрестное соединение, пока вам это не понадобится.
источник
Перекрестное и внутреннее объединение одинаковы с той лишь разницей, что при внутреннем объединении мы логически фильтруем некоторые результаты декартового произведения.
Именно на основе наших данных мы решаем, что существует только один случай поля, которое мы используем для объединения. Объединение только перекрестного объединения обеих таблиц и получение только строк, выполняющих специальное логическое выражение.
Обратите внимание, что если поля, в которых мы выполняем соединения, будут нулевыми в обеих таблицах, мы пропустим фильтр. Это зависит от нас или производителя базы данных, чтобы добавить дополнительные правила, чтобы избежать или разрешить нулевые значения. Придерживаясь основ, это просто перекрестное соединение, за которым следует фильтр.
источник
Внутреннее соединение даст результат совпавших записей между двумя таблицами, где в качестве перекрестного соединения вы можете найти возможные комбинации между двумя таблицами.
источник
A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}
cross join
действовать как декартово произведение A ✖ B = {1,2}, {1,8} ..., {5,2}, {5,8}, {5,5} ..... {3,3} ..., {6,6} .... {8,9} и вернули этот длинный набор результатов ..когда обработка
inner join
выполняется через декартово произведение, и выберите совпадающие пары. Если вы считаете, что упорядоченные пары являются первичными ключами двух таблиц, и при поиске предложения для A = Binner join
выберите {5,5}, {4,4}, {6,6} , {9,9} и вернул запрашиваемый столбец в предложении select, относящемся к этим идентификаторам.если
cross join
на a = b, то это результат того же набора результатов, что иinner join
. в этом случае также используйтеinner join
.источник
Это зависит от ожидаемого результата.
Перекрестное соединение сопоставляет все строки в одной таблице со всеми строками в другой таблице. Внутреннее соединение соответствует полю или полям. Если у вас одна таблица с 10 строками, а другая с 10 строками, то эти два соединения будут вести себя по-разному.
В перекрестном соединении будет возвращено 100 строк, и они не будут связаны, только то, что называется декартовым произведением. Внутреннее соединение будет сопоставлять записи друг с другом. Предполагая, что у одного есть первичный ключ, а у другого - внешний ключ, вы получите 10 возвращенных строк.
Перекрестное объединение имеет ограниченную общую полезность, но существует для полноты и описывает результат объединения таблиц без связей, добавленных к запросу. Вы можете использовать перекрестное соединение для составления списков комбинаций слов или чего-то подобного. Внутреннее соединение, с другой стороны, является наиболее распространенным соединением.
источник