Sql using: sql — В чём разница между using и on в join-запросах?
Содержание
sql server — Использование sql с пунктом where
Как я могу использовать with в подобном запросе? Есть ли способ использовать tableId в TableList? Могу ли я относиться к ним как к подзапросу?
выберите * из TestTable, где tableId в (СО списком таблиц (идентификатор таблицы) КАК ( ВЫБЕРИТЕ tableId ИЗ OldTable, ГДЕ tableId = 5 и IsDeleted = 0 СОЮЗ ВСЕХ ВЫБЕРИТЕ t.tableId из OldTable как t INNER JOIN TableList как p ON t.ParenTableId = p.TableId ГДЕ t.IsDeleted = 0 ) ВЫБРАТЬ tableId ИЗ TableList )
РЕДАКТИРОВАТЬ: Чтобы показать, почему я не могу использовать в первом выражении sql.
выберите TableId, IsDeleted, ( выберите количество (OtherId) OtherTable где otherTableId в (СО списком таблиц (идентификатор таблицы) КАК ( ВЫБЕРИТЕ tableId ИЗ OldTable, ГДЕ tableId = 5 и IsDeleted = 0 СОЮЗ ВСЕХ ВЫБЕРИТЕ t.tableId из OldTable как t INNER JOIN TableList как p ON t.ParenTableId = p.TableId ГДЕ t.IsDeleted = 0 ) ВЫБРАТЬ tableId ИЗ TableList ) ) как Ex1 из TestTable, где tableId в (1,2,3)
Думаю, это показывает, почему я пытаюсь использовать предложение with в середине SQL-запроса.
- sql
- sql-сервер
- подзапрос
- где-предложение
- с-предложение
2
Перед вызовом SQL необходимо определить свой WITH CTE:
WITH TableList (tableId) КАК ( ВЫБЕРИТЕ tableId ИЗ OldTable, ГДЕ tableId = 5 и IsDeleted = 0 СОЮЗ ВСЕХ ВЫБЕРИТЕ t.tableId из OldTable как t INNER JOIN TableList как p ON t.ParenTableId = p.TableId ГДЕ t.IsDeleted = 0 ) ВЫБИРАТЬ * ИЗ тестовой таблицы ГДЕ tableId в ( ВЫБРАТЬ tableId ИЗ TableList )
РЕДАКТИРОВАТЬ. Основываясь на ваших комментариях, вы можете определить свой рекурсивный CTE в VIEW, а затем использовать по мере необходимости:
CREATE VIEW YourView AS С таблицей (tableId) КАК ( ВЫБЕРИТЕ tableId ИЗ OldTable, ГДЕ tableId = 5 и IsDeleted = 0 СОЮЗ ВСЕХ ВЫБЕРИТЕ t.tableId из OldTable как t INNER JOIN TableList как p ON t. ParenTableId = p.TableId ГДЕ t.IsDeleted = 0 ) ВЫБИРАТЬ * ИЗ списка таблиц;
5
Я предпочитаю делать это в JOIN
, поэтому это выглядит так. Оператор WITH
всегда является первым в операторе запроса sql.
Ключевое слово DISTINCT
применяется к предложению SELECT
, чтобы результат был уникальным при наличии записей из TestTable
, которые имеют несколько совпадений с общим табличным выражением.
С таблицей (tableId) КАК ( ВЫБЕРИТЕ tableId ИЗ OldTable, ГДЕ tableId = 5 и IsDeleted = 0 СОЮЗ ВСЕХ ВЫБЕРИТЕ t.tableId из OldTable как t INNER JOIN TableList как p ON t.ParenTableId = p.TableId ГДЕ t.IsDeleted = 0 ) ВЫБЕРИТЕ ОТЛИЧНЫЙ a.* ИЗ тестовой таблицы Список таблиц INNER JOIN b ON a.tableId = b.tableId
ОБНОВЛЕНИЕ 1
С TableList (tableId) КАК ( ВЫБЕРИТЕ tableId ИЗ OldTable, ГДЕ tableId = 5 и IsDeleted = 0 СОЮЗ ВСЕХ ВЫБЕРИТЕ t. tableId из OldTable как t INNER JOIN TableList как p ON t.ParenTableId = p.TableId ГДЕ t.IsDeleted = 0 ) ВЫБЕРИТЕ РАЗЛИЧНЫЕ t.TableId, t.IsDeleted, f.totalCount ИЗ Тестовой таблицы t ВНУТРЕННЕЕ СОЕДИНЕНИЕ ( ВЫБЕРИТЕ a.otherTableId, COUNT (DISTINCT a.OtherId) totalCount ОТ ДругогоТаблица а Список таблиц INNER JOIN b ON b.tableId = a.otherTableId СГРУППИРОВАТЬ ПО otherTableId ) f ON t.tableId = f.otherTableId ГДЕ t.tableId в (1,2,3)
2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
SQL JOIN USING — Руководство для начинающих
Последнее изменение:
Представьте, что у вас есть инструмент, который может автоматически обнаруживать проблемы с производительностью JPA и Hibernate.
Разве это не было бы просто потрясающе?Именно таким инструментом является Hypersistence Optimizer!
И он работает с Spring Boot, Spring Framework, Jakarta EE, Java EE, Quarkus или Play Framework.Итак, наслаждайтесь тем, что вам нравится, вместо того, чтобы устранять проблемы с производительностью в вашей производственной системе субботним вечером!
Введение
В этой статье мы увидим, как предложение JOIN USING работает в SQL и как мы можем использовать его для замены условия ON, когда столбцы, используемые для соединения двух таблиц, имеют одно и то же имя в обеих таблицах. родительская и дочерняя таблицы.
Таблицы базы данных
Чтобы продемонстрировать, как работает предложение JOIN USING, мы собираемся использовать следующие таблицы базы данных post
и post_comment
, которые формируют связь один ко многим через столбец внешнего ключа post_id
. в таблице post_comment
, которая ссылается на столбец первичного ключа post_id
в таблице post
:
В родительском посте есть следующие 3 строки.Таблица 0040:
| post_id | название | |---------|-----------| | 1 | Ява | | 2 | Спящий режим | | 3 | JPA |
и дочерняя таблица post_comment
имеет следующие 3 записи:
| post_comment_id | обзор | post_id | |-----------------|------------|---------| | 1 | Хорошо | 1 | | 2 | Отлично | 1 | | 3 | Потрясающе | 2 |
Предложение SQL JOIN ON с пользовательской проекцией
Как правило, при написании запроса INNER JOIN или LEFT JOIN мы используем предложение ON для определения условия соединения.
Например, чтобы получить комментарии, а также соответствующий заголовок сообщения и идентификатор сообщения, мы можем написать следующий запрос проекции SQL:
ВЫБИРАТЬ пост. post_id, заголовок, обзор ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ON post.post_id = post_comment.post_id ЗАКАЗАТЬ ПО post.post_id, post_comment_id
И мы получим следующий набор результатов:
| post_id | название | обзор | |---------|------------|-----------| | 1 | Ява | Хорошо | | 1 | Ява | Отлично | | 2 | Спящий режим | Потрясающе |
Предложение SQL JOIN USING с пользовательской проекцией
Если столбец внешнего ключа и столбец, на который он ссылается, имеют одно и то же имя, вы можете использовать предложение USING, например:
ВЫБИРАТЬ post_id, заголовок, обзор ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ИСПОЛЬЗОВАНИЕ(post_id) ЗАКАЗАТЬ ПО post_id, post_comment_id
И набор результатов вышеуказанного запроса будет идентичен предыдущему SQL-запросу, в котором использовалось предложение ON:
| post_id | название | обзор | |---------|------------|-----------| | 1 | Ява | Хорошо | | 1 | Ява | Отлично | | 2 | Спящий режим | Потрясающе |
Предложение USING работает для Oracle, PostgreSQL, MySQL и MariaDB. SQL Server не поддерживает предложение USING, поэтому вместо него нужно использовать предложение ON.
Предложение USING можно использовать с операторами INNER, LEFT, RIGHT и FULL JOIN.
Предложение SQL JOIN ON с SELECT *
Теперь, если мы изменим предыдущий запрос предложения ON, чтобы выбрать все столбцы:
ВЫБИРАТЬ * ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ON post.post_id = post_comment.post_id ЗАКАЗАТЬ ПО post.post_id, post_comment_id
Мы получим следующий набор результатов:
| post_id | название | post_comment_id | обзор | post_id | |---------|------------|-----------------|--------- --|---------| | 1 | Ява | 1 | Хорошо | 1 | | 1 | Ява | 2 | Отлично | 1 | | 2 | Спящий режим | 3 | Потрясающе | 2 |
Обратите внимание, что post_id
дублируется, поскольку обе таблицы post
и post_comment
содержат столбец post_id
.
Предложение SQL JOIN USING с SELECT *
С другой стороны, если мы запустим запрос SELECT * с предложением USING:
ВЫБИРАТЬ * ОТ поста ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ИСПОЛЬЗОВАНИЕ(post_id) ЗАКАЗАТЬ ПО post_id, post_comment_id
Мы собираемся получить следующий набор результатов:
| post_id | название | post_comment_id | обзор | |---------|------------|-----------------|--------- --| | 1 | Ява | 1 | Хорошо | | 1 | Ява | 2 | Отлично | | 2 | Спящий режим | 3 | Потрясающе |
Мы видим, что столбец post_id
дедуплицирован, поэтому в набор результатов включен один столбец post_id
.
Если вам понравилась эта статья, держу пари, вам понравятся мои Книга и Видеокурсы .
И это еще не все!
Вы можете получить значительный пассивный доход от продвижения всех этих замечательных продуктов, которые я создаю.
Если вы хотите увеличить свой доход, присоединяйтесь к моей партнерской программе.
Заключение
Если вы проектируете схему базы данных таким образом, чтобы имена столбцов внешнего ключа соответствовали столбцам, на которые они ссылаются, а условия ПРИСОЕДИНЕНИЯ проверяют только, равно ли значение столбца внешнего ключа значению его зеркального столбца в другой таблице, то вы можете использовать предложение USING.
В противном случае, если имя столбца внешнего ключа отличается от столбца, на который он ссылается, или если вы хотите включить более сложное условие соединения, вместо этого следует использовать предложение ON.