Моя проблема
У меня есть вопрос о подзапросе в 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. По этой причине это коррелированный подзапрос.
Другими словами, Запрос будет выполняться следующим образом:
Внешний запрос нашел значение "custid" и "companyname" для моей ПЕРВОЙ СТРОКИ в моей таблице C
Внутренний запрос рассмотрит первую строку моей таблицы O
- Внутренний запрос будет сравнивать значение C.custid, найденное в ПЕРВОЙ СТРОКЕ ТАБЛИЦЫ C, со значением O.custid, найденное в ПЕРВОЙ СТРОКЕ O ТАБЛИЦЫ
- Внутренний запрос будет сравнивать значение O.orderdate, найденного в ПЕРВОЙ строке таблицы O, с '20070212'.
Внутренний Запрос пойдет на СЛЕДУЮЩУЮ СТРОКУ моего О-ТАБЛИЦЫ
Внутренний запрос будет повторять шаги 2–5 с СЛЕДУЮЩЕЙ СТРОКОЙ O ТАБЛИЦЫ вместо ПЕРВОЙ СТРОКИ O ТАБЛИЦЫ до тех пор, пока он не достигнет конца О ТАБЛИЦЫ
Внешний запрос рассмотрит следующую строку
Шаг 2-7 будет повторяться, но на этот раз они будут сравнивать O.custid со значением C.custid в СЛЕДУЮЩЕМ СТРОКЕ и до конца C TABLE
Моя вторая проблема
Теперь, если я правильно понял принцип коррелированного подзапроса.
Вопрос, который я задаю себе, таков:
Почему мы должны использовать псевдонимы?
В приведенном выше примере мы могли бы сказать, что это потому, что мы используем две таблицы с каждой колонкой с одинаковым именем.
Однако в случае, когда два столбца не были бы названы как «custid», какова была бы полезность псевдонимов?
Это потому, что команда SELECT изменяет таблицу определенным образом?
Поскольку, если таблица не изменена, у меня возникают проблемы с пониманием необходимости псевдонимов в коррелированном подзапросе.
Примечание: Я знаю, что Correlated Subquery также можно оптимизировать с помощью Join, но я действительно хочу сосредоточиться на базе коррелированного SubQuery.