Что такое коррелированный подзапрос?Чем он отличается от некоррелированного подзапроса?А зачем нам Алиас? - PullRequest
1 голос
/ 03 июля 2019

Моя проблема

У меня есть вопрос о подзапросе в SQL.

Я пытаюсь, среди прочего, проверить , понял ли я принцип коррелированного подзапроса , но также понять заинтересованность псевдонимов в этом.

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


Пример

Рассмотрим следующий запрос в качестве примера:

SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS
(SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND O.orderdate = '20070212');

Из этого запроса я отделяю внешний и внутренний запрос:

Внешний запрос:

SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS

Внутренний запрос:

SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND O.orderdate = '20070212'

Мое понимание

Из того, что я понял, по этой причине мы можем говорить о коррелированном подзапросе в этом случае:

В SQL запрос выполняется построчно. Он выберет строку 1, затем строку 2, затем строку 3 и т. Д.

Так как в моем Внутреннем Запросе я использую C.custid (т.е. столбец, значение которого будет прочитано строка за строкой Моим Внешним Запросом), и я сравниваю его с O.custid (целый столбец, который также должен быть читать построчно).

Для этого запроса необходимо сначала проверить все строки моего массива O, прежде чем перейти к следующей строке в моем массиве C. По этой причине это коррелированный подзапрос.

Другими словами, Запрос будет выполняться следующим образом:

  1. Внешний запрос нашел значение "custid" и "companyname" для моей ПЕРВОЙ СТРОКИ в моей таблице C

  2. Внутренний запрос рассмотрит первую строку моей таблицы O

  3. Внутренний запрос будет сравнивать значение C.custid, найденное в ПЕРВОЙ СТРОКЕ ТАБЛИЦЫ C, со значением O.custid, найденное в ПЕРВОЙ СТРОКЕ O ТАБЛИЦЫ
  4. Внутренний запрос будет сравнивать значение O.orderdate, найденного в ПЕРВОЙ строке таблицы O, с '20070212'.
  5. Внутренний Запрос пойдет на СЛЕДУЮЩУЮ СТРОКУ моего О-ТАБЛИЦЫ

  6. Внутренний запрос будет повторять шаги 2–5 с СЛЕДУЮЩЕЙ СТРОКОЙ O ТАБЛИЦЫ вместо ПЕРВОЙ СТРОКИ O ТАБЛИЦЫ до тех пор, пока он не достигнет конца О ТАБЛИЦЫ

  7. Внешний запрос рассмотрит следующую строку

  8. Шаг 2-7 будет повторяться, но на этот раз они будут сравнивать O.custid со значением C.custid в СЛЕДУЮЩЕМ СТРОКЕ и до конца C TABLE


Моя вторая проблема

Теперь, если я правильно понял принцип коррелированного подзапроса. Вопрос, который я задаю себе, таков:

Почему мы должны использовать псевдонимы?

В приведенном выше примере мы могли бы сказать, что это потому, что мы используем две таблицы с каждой колонкой с одинаковым именем.
Однако в случае, когда два столбца не были бы названы как «custid», какова была бы полезность псевдонимов?

Это потому, что команда SELECT изменяет таблицу определенным образом?

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

Примечание: Я знаю, что Correlated Subquery также можно оптимизировать с помощью Join, но я действительно хочу сосредоточиться на базе коррелированного SubQuery.


1 Ответ

0 голосов
/ 04 июля 2019

Итак, по-видимому, мое понимание коррелированного подзапроса хорошее.

В некоррелированном подзапросе:
Внутренний запрос будет выполнен один раз (всего)
Но в коррелированном подзапросе будет выполняться один раз для каждой строки моего внешнего запроса.

Однако я до сих пор не знаю, зачем нужен псевдоним.

...