top [n] with ties
От: HomoHabilis  
Дата: 04.07.16 19:40
Оценка:
Господа вопрос, гипотетически в какой ситуации работает правильно такой запрос

select top 1 with ties name, ct
from pit
where cc = 1 
order by ct desc;


а такой неправильно
select name, ct
from pit
where cc = 1 and ct = (select max(ct) from pit)


мне кажется на каких данных он используется не имеет значения ( может не прав).
Не совсем улавливаю в чем их разница.
Мне попалось тестовое задание и на первый вопрос пишет правильно, на второй несовпадение данных.
Отредактировано 04.07.2016 20:15 ГАИ . Предыдущая версия .
Re: top [n] with ties
От: Olaf Россия  
Дата: 05.07.16 03:47
Оценка: 73 (2)
Здравствуйте, HomoHabilis, Вы писали:

HH>Господа вопрос, гипотетически в какой ситуации работает правильно такой запрос

HH>...
HH>а такой неправильно
HH>...

HH>мне кажется на каких данных он используется не имеет значения ( может не прав).

HH>Не совсем улавливаю в чем их разница.
HH>Мне попалось тестовое задание и на первый вопрос пишет правильно, на второй несовпадение данных.

Ваши запросы не являются логически эквивалентными, потому что

Поэтому возвращаемые данные будут идентичны только в том случае, если для записей с cc = 1 максимальное значение поля ct будет совпадать с максимальным значением среди ВСЕХ записей таблицы.

Чтобы построить эквивалент, необходимо второй запрос переписать так
select name, ct
from pit
where cc = 1 and ct = (select max(ct) from pit p where p.cc = 1)

Однако это еще не все, даже если вы получите логически эквивалентные запросы, они могут выдавать разные результаты, но это уже будет определяться составом данных. Например, при условии, что все значения ct для сс = 1 равны NULL, первый запрос вернет все записи с cc = 1, а второй не вернет ничего. Речь шла в контексте SQL Server для настроек по умолчанию, на других СУБД возможно могут быть свои особенности.
Re[2]: top [n] with ties
От: HomoHabilis  
Дата: 05.07.16 05:10
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, HomoHabilis, Вы писали:



O>Поэтому возвращаемые данные будут идентичны только в том случае, если для записей с cc = 1 максимальное значение поля ct будет совпадать с максимальным значением среди ВСЕХ записей таблицы.


O>Чтобы построить эквивалент, необходимо второй запрос переписать так

O>
O>select name, ct
O>from pit
O>where cc = 1 and ct = (select max(ct) from pit p where p.cc = 1)
O>


а ведь точно, и все заработало. как то упустил, ведь явно, перечитал условия задачи, ошибку допустил, спс.

O>Однако это еще не все, даже если вы получите логически эквивалентные запросы, они могут выдавать разные результаты, но это уже будет определяться составом данных. Например, при условии, что все значения ct для сс = 1 равны NULL, первый запрос вернет все записи с cc = 1, а второй не вернет ничего. Речь шла в контексте SQL Server для настроек по умолчанию, на других СУБД возможно могут быть свои особенности.


за вторую часть тоже спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.