Как написать условие ON для CROSS JOIN в SQL SERVER

Невозможно записать условие соединения с помощью предложения ON.

Это работает:

SELECT STUDENT.STD_NAME,CLASS_SUBJECT.SUB_NAME 
FROM STUDENT CROSS JOIN CLASS_SUBJECT 
WHERE STUDENT.CLS_ID=CLASS_SUBJECT.CLS_ID

Это не работает:

SELECT STUDENT.STD_NAME,CLASS_SUBJECT.SUB_NAME 
FROM STUDENT CROSS JOIN CLASS_SUBJECT ON STUDENT.CLS_ID=CLASS_SUBJECT.CLS_ID

(ВНУТРЕННЕЕ) СОЕДИНЕНИЕ НА 1=1 является ПЕРЕКРЕСТНЫМ СОЕДИНЕНИЕМ. В некоторых СУБД вы можете использовать (INNER) JOIN без ON, что означает CROSS JOIN. Но это не стандартный SQL. PS (Очевидно--) Это часто задаваемые вопросы. Прежде чем рассматривать публикацию, пожалуйста, всегда гуглите свое сообщение об ошибке или много четких, кратких и точных формулировок вашего вопроса/проблемы/цели, с вашими конкретными строками/именами и без них, и читайте много ответов. Если вы публикуете вопрос, используйте одну фразу в качестве заголовка. См. Как спросить и тексты при наведении указателя мыши на стрелку голосования.

philipxy 22.05.2019 12:50

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

philipxy 22.05.2019 13:03
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
3
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

CROSS JOIN не использует предложение ON. Он производит декартово произведение, соответствующее всем записям из обеих таблиц. Есть только очень редкие случаи, когда вы действительно этого хотите.

Если вам нужно условное сопоставление записей между таблицами (например, где совпадают значения ключей), вы должны использовать INNER JOIN или один из вариантов OUTER JOIN (LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN).

Возможно сочетание CROSS JOIN с предложением WHERE для условного сопоставления записей, но в таких случаях рекомендуется использовать INNER JOIN.

@Bart Hofland Спасибо, что разъяснили мои сомнения по поводу использования условия ON. Ваш ответ «CROSS JOIN не использует предложение ON» меня утешил.

Chandra 22.05.2019 13:16

@philipxy Я согласен. Я отредактировал свой ответ и вместо этого изменил «сопоставление записей» на «условное сопоставление записей». Однако я не знаком с какой-либо формальной терминологией.

Bart Hofland 22.05.2019 14:19

Вы используете расплывчатые фразы, которые могут быть разумно применены к тому, о чем вы говорите, но четко не указываете/не говорите, о чем вы говорите. Это не вопрос формальных терминов, это вопрос (усилия) использования достаточного количества слов, чтобы ясно и полностью выразить то, что вы имеете в виду. (Упражнение: попробуйте определить, что означает «сопоставление записей», а затем «условное», таким образом, чтобы вы могли заменить определения терминов — это не очевидные значения.) Вы имеете в виду что-то вроде, если вы хотите, чтобы каждая левая входная строка быть частью некоторой выходной строки или, если вы хотите, чтобы по крайней мере одна выходная строка была для каждой входной строки.

philipxy 22.05.2019 20:11

О... Или, может быть, когда вы говорите «сопоставление записей», вы просто говорите о соединениях в целом, внутренних или внешних. Затем, я полагаю, вы добавили «условный», поскольку перекрестное соединение является безусловным, поскольку оно не идет с ON. Так что, возможно, ваше использование «условного» подтолкнуло мое первое предположение / впечатление от чтения этой версии, когда оно не предвзято к предыдущей версии, к тому, что вы имели в виду. Но в целом старайтесь использовать достаточно слов, чтобы быть однозначно ясным.

philipxy 22.05.2019 20:20

@philipxy Кажется, я понимаю, что ты имеешь в виду. И я согласен. Я понимаю, что моя формулировка, вероятно, была не такой ясной и однозначной, как можно было бы ожидать. Я прошу прощения за это. Буду думать над перефразировкой. Однако я не собираюсь подробно объяснять, что такое соединения. Я просто хотел кратко и примерно указать на разницу между перекрестными соединениями и различными другими соединениями. Для полного и академически правильного описания каждого типа соединения в Интернете есть гораздо лучшие источники документации, чем я мог бы когда-либо записать в одном простом ответе.

Bart Hofland 22.05.2019 23:29

Другие вопросы по теме