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.