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

Откуда:
Сообщений: 1197
есть такой код

select * from dbo.Guests
	where roomtypeid = ANY (select roomtypeid from dbo.rooms where room_Typeid > 2)

в таблице Rooms столбца roomtypeid нет, есть room_typeid, но запрос выполняется, хотя и неверно, а вот если указать верное название столбца, то всё работает правильно.

Как это объяснить?
5 окт 09, 12:00    [7741823]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
алиасы таблицам дайте
5 окт 09, 12:01    [7741832]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
relief
Member

Откуда:
Сообщений: 1197
Паганель
алиасы таблицам дайте


дал - работает. А что это ошибка скл?
5 окт 09, 12:04    [7741857]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
relief
дал
и как стал выглядет запрос?
5 окт 09, 12:05    [7741864]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
aleks2
Guest
relief
есть такой код

select * from dbo.Guests
	where roomtypeid = ANY (select roomtypeid from dbo.rooms where room_Typeid > 2)

в таблице Rooms столбца roomtypeid нет, есть room_typeid, но запрос выполняется, хотя и неверно, а вот если указать верное название столбца, то всё работает правильно.

Как это объяснить?


Откуда сервер должен догадаться, шо тебе кажеться, шо должно быть так
select * from dbo.Guests
	where roomtypeid = ANY (select dbo.rooms.roomtypeid from dbo.rooms where room_Typeid > 2)

а не так
select * from dbo.Guests
	where roomtypeid = ANY (select dbo.Guests.roomtypeid from dbo.rooms where room_Typeid > 2)
?
5 окт 09, 12:06    [7741872]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Добрый Э - Эх
Guest
relief
есть такой код

select * from dbo.Guests
	where roomtypeid = ANY (select roomtypeid from dbo.rooms where room_Typeid > 2)

в таблице Rooms столбца roomtypeid нет, есть room_typeid, но запрос выполняется, хотя и неверно, а вот если указать верное название столбца, то всё работает правильно.

Как это объяснить?
Область видимости имен таблиц и полей в таблицах для внутреннего запроса не ограничивается только внутренним запросом. Он в легкую видит таблицы и поля таблиц внешнего запроса, из которого, собственно, и произошел вызов этого коррелированного подзапроса. Стало быть, для успешной работы запроса достаточно, что бы все упомянутые поля присутствовали ИЛИ в таблицах внутреннего подзапроса ИЛИ в таблицах внешнего запроса...
5 окт 09, 12:08    [7741892]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
relief
Member

Откуда:
Сообщений: 1197
Паганель
relief
дал
и как стал выглядет запрос?


select g.* from dbo.Guests as g
where g.roomtypeid = ANY (select r.room_typeid from dbo.rooms as r where r.room_Typeid > 2)
5 окт 09, 12:08    [7741894]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
relief
select g.* from dbo.Guests as g
	where g.roomtypeid = ANY (select r.room_typeid from dbo.rooms as r where r.room_Typeid > 2)
Вот и прекрасно, Вы объяснили серверу, чего Вы от него хотите
Если бы Вы так сделали с самого начала, то данный вопрос у Вас бы и не возник

Еще бы регистры не путать... правило хорошего тона просто...
Еще бы звездочку не использовать... по той же причине...
Ну это я, вообще-то, придираюсь...
5 окт 09, 12:15    [7741945]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
relief
Member

Откуда:
Сообщений: 1197
Паганель
relief
select g.* from dbo.Guests as g
	where g.roomtypeid = ANY (select r.room_typeid from dbo.rooms as r where r.room_Typeid > 2)
Вот и прекрасно, Вы объяснили серверу, чего Вы от него хотите
Если бы Вы так сделали с самого начала, то данный вопрос у Вас бы и не возник

Еще бы регистры не путать... правило хорошего тона просто...
Еще бы звездочку не использовать... по той же причине...
Ну это я, вообще-то, придираюсь...


да уж. я и не знал про то, что внутренние запросы видят столбцы внешних таблиц.
А для чего это нужно?

и т.е. получается что если есть вложенные запросы, то всегда лучше использовать алиасы?
5 окт 09, 12:20    [7741987]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
relief
я и не знал про то, что внутренние запросы видят столбцы внешних таблиц.
А для чего это нужно?
Ну мало ли... Вдруг Вам понадобится нечто такое:
select g.roomtypeid, g.flag
  from dbo.Guests as g
 where g.roomtypeid = ANY (select r.room_Typeid
                             from dbo.rooms as r 
                            where r.room_Typeid > 2
                              and r.flag = g.flag)
вот разработчики СУБД и разрешили...
5 окт 09, 12:27    [7742048]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Добрый Э - Эх
Guest
relief
да уж. я и не знал про то, что внутренние запросы видят столбцы внешних таблиц.
А для чего это нужно?

И как же внутренний коррелированный подзапрос получал бы "входные данные" из внешнего запроса в противном случае?
5 окт 09, 12:27    [7742052]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Добрый Э - Эх
Guest
relief
и т.е. получается что если есть вложенные запросы, то всегда лучше использовать алиасы?
Алиасы вообще лучше использовать ВСЕГДА, не зависимо от наличия/отсутствия подзапросов
5 окт 09, 12:28    [7742058]     Ответить | Цитировать Сообщить модератору
 Re: странное поведение ANY  [new]
Glory
Member

Откуда:
Сообщений: 104760
relief


да уж. я и не знал про то, что внутренние запросы видят столбцы внешних таблиц.
А для чего это нужно?

и т.е. получается что если есть вложенные запросы, то всегда лучше использовать алиасы?

Для того, чтобы результат подзапороса мог зависеть от значения столбцов внешнего запроса
5 окт 09, 12:34    [7742110]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить