Подтвердить что ты не робот

Почему этот подзапрос НЕ вызывает ошибку?

Меня смущает SQL-запрос, и, честно говоря, это одна из тех вещей, о которых я даже не знаю, как Google. Таким образом StackOverflow.

У меня есть то, что я считаю простым запросом.

SELECT Id
FROM Customer
WHERE Id IN (SELECT Id from @CustomersWithCancelledOrders)

Здесь я нахожу странность. В переменной @CustomersWithCancelledOrders нет столбца с именем Id. Но ошибки нет.

В результате это идентификаторы для всех клиентов. Каждый из. Который, очевидно, побеждает в том, что нужно выполнить подзапрос.

Это похоже на использование столбца Идентификатор из внешней таблицы (Клиенты), но я не понимаю, почему он это сделает. Есть ли причина, по которой вы хотели бы это сделать? Я пропустил что-то невероятно очевидное?

SQLFiddle от странности. Это не лучший SQL Fiddle, поскольку я не мог найти способ вернуть несколько наборов результатов на этом веб-сайте, но он демонстрирует, как я столкнулся с этой проблемой.

Я предполагаю, что то, что я ищу, - это имя для "функции" выше, какая-то информация о том, почему он делает то, что он делает, и о том, что на самом деле означает неправильный запрос.


Я обновил вышеупомянутый вопрос, чтобы использовать немного лучший пример. Его все еще изобретали, но его ближе к script я написал, когда я действительно столкнулся с проблемой.


После некоторого чтения коррелированных подзапросов это выглядит так: моя опечатка (используя неправильный столбец Id в подзапросе) изменяет поведение подзапроса.

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

Это означает, что подзапрос оценивает набор различных результатов для каждой строки, и в этом наборе результатов гарантируется идентификатор клиента этой строки. Подзапрос возвращает набор, состоящий из идентификатора строки, повторенной X раз, где X - количество строк в переменной таблицы, которая выбрана из.

...

Свое очень сложно написать краткое описание моего понимания проблемы. Сожалею. Я думаю, что теперь я хорош.

4b9b3361

Ответ 1

Это предназначалось для поведения, потому что в подчиненном запросе вы можете получить доступ к именам столбцов "внешние запросы". Это означает, что вы можете использовать Id из таблицы в подзапросе, и поэтому запрос предполагает, что вы используете Id.

Вот почему вы должны квалифицироваться с помощью псевдонимов или полных имен при работе с подзапросами.

Например; проверить | http://support.microsoft.com/kb/298674

Ответ 2

SELECT ID
FROM [Table]
WHERE ID IN (SELECT OtherTable.ID FROM OtherTable)

Это приведет к возникновению ошибки. Как сказал Аллан С. Хансес, в подзапросе вы можете использовать столбцы из основного запроса.

См. этот пример

SELECT ID
FROM [Table]
WHERE ID IN (SELECT ID)

Ответ 3

Запрос представляет собой коррелированный подзапрос и чаще всего используется для ограничения результатов внешнего запроса на основе столбца, возвращаемого подзапросом; следовательно, "коррелирован". В этом примере идентификатор во внутреннем запросе на самом деле является идентификатором из таблицы во внешнем запросе. Это делает запрос действительным, но, вероятно, не дает вам никаких полезных результатов, поскольку он фактически не коррелирует между внешними и внутренними запросами.