Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объясните результат запроса  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
Добрый день.

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

DECLARE @Cust TABLE (CustID int)
INSERT INTO @Cust
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6;

DECLARE @Cust2 TABLE (CustID int)
INSERT INTO @Cust2
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3;

SELECT	CustID
FROM	@Cust Cust
WHERE	CustID IN (
				   SELECT Cust.CustID
				   FROM	  @Cust2
				   );
17 дек 11, 14:36    [11782069]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Ваш запрос эквивалентен
SELECT	CustID
FROM	@Cust Cust
WHERE	CustID IN (
				   SELECT Cust.CustID
				   );				  
17 дек 11, 14:58    [11782151]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
Пустая таблица
Guest
invm
Ваш запрос эквивалентен
SELECT	CustID
FROM	@Cust Cust
WHERE	CustID IN (
				   SELECT Cust.CustID
				   );				  



Есть небольшое но значимое отличие, и проявляется оно когда @Cust2 пуста.
17 дек 11, 15:37    [11782278]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
ЗдОрово, не знал этого )
А чем обусловлено такое поведение? Мне кажется, что более естественным поведением было бы вернуть ошибку вроде
"The multi-part identifier "Cust.CustID" could not be bound." ведь подзапрос некоррелированный, значит связи с внешним нет.
17 дек 11, 16:22    [11782449]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Timid
ЗдОрово, не знал этого )
А чем обусловлено такое поведение? Мне кажется, что более естественным поведением было бы вернуть ошибку вроде
"The multi-part identifier "Cust.CustID" could not be bound." ведь подзапрос некоррелированный, значит связи с внешним нет.
Подзапрос коррелированный.
С чего Вы взяли, что нет?
17 дек 11, 16:27    [11782473]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
iap
Timid
ЗдОрово, не знал этого )
А чем обусловлено такое поведение? Мне кажется, что более естественным поведением было бы вернуть ошибку вроде
"The multi-part identifier "Cust.CustID" could not be bound." ведь подзапрос некоррелированный, значит связи с внешним нет.
Подзапрос коррелированный.
С чего Вы взяли, что нет?

Я не вижу связи между основным запросом и подзапросом, может не так смотрю? )
17 дек 11, 16:31    [11782490]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
SELECT	CustID
FROM	@Cust Cust
WHERE	CustID IN (
				   SELECT Cust.CustID
				   FROM	  @Cust2
				   WHERE  CustID = 	Cust.CustID
				   );

Что-то типа этого
17 дек 11, 16:32    [11782496]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Timid, коррелированный подзапрос -- это запрос, который содержит ссылку на столбец (столбцы) внешнего запроса.
17 дек 11, 17:41    [11782703]     Ответить | Цитировать Сообщить модератору
 Re: Объясните результат запроса  [new]
Timid
Member

Откуда: Украина, Винница
Сообщений: 277
invm
Timid, коррелированный подзапрос -- это запрос, который содержит ссылку на столбец (столбцы) внешнего запроса.

Ясно, спасибо.
17 дек 11, 20:05    [11783082]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить