Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "order by" и "top 100 percent", во вложенном запросе 
V
    Опции темы
KOHCEPBATOP
Дата 29.9.2010, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: нет
Всего: 1



Столкнулся с неожиданной [для меня] проблемой. При использовании данной конструкции:
Код
select * from ( select percent * from tbl order by fld ) tmp

выдается ошибка: "The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified."


Нашел в инете ее решение:
select * from ( select top 100 percent * from tbl order by fld ) tmp

Но хотелось бы понять, почему во втором случае добавление "top 100 percent" прокатывает.

PM MAIL   Вверх
boevik
Дата 29.9.2010, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



percent относится к конструкции top
Код

select top 50 percent * from tbl order by fld

выдаст 50% результатов.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Zloxa
Дата 29.9.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(KOHCEPBATOP @  29.9.2010,  08:57 Найти цитируемый пост)
Но хотелось бы понять, почему во втором случае добавление "top 100 percent" прокатывает

Наверное потому что, что top без сортировки мало полезен в виду своей недетерменированности, потому для него и сделано исключение.

Цитата(KOHCEPBATOP @  29.9.2010,  08:57 Найти цитируемый пост)
неожиданной 

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
KOHCEPBATOP
Дата 29.9.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: нет
Всего: 1



Цитата(Zloxa @  29.9.2010,  09:51 Найти цитируемый пост)
Наверное потому что, что top без сортировки мало полезен в виду своей недетерменированности, потому для него и сделано исключение.
Т.е. это всё-таки исключение? Своего рода "недокументированная фича"?

Цитата(Zloxa @  29.9.2010,  09:51 Найти цитируемый пост)
Позвольте полюбопытствовать, а зачем Вам нужна сортировка в подзапросе? 

Я использовал следующий вариант:
select distinct * from ( select top 100 percent fld1 from tbl order by fld2 ) tmp

Посколько distinct вместе с order by не прокатывает, а сортировка осуществляется по полям, отсутствующим на выходе.

PM MAIL   Вверх
Zloxa
Дата 29.9.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(KOHCEPBATOP @  29.9.2010,  12:28 Найти цитируемый пост)
Т.е. это всё-таки исключение? Своего рода "недокументированная фича"?

А вы сам текст ошибки читать пробовали?
Цитата(KOHCEPBATOP @  29.9.2010,  08:57 Найти цитируемый пост)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified



Цитата(KOHCEPBATOP @  29.9.2010,  12:28 Найти цитируемый пост)
Я использовал следующий вариант:
select distinct * from ( select top 100 percent fld1 from tbl order by fld2 ) tmp

Посколько distinct вместе с order by не прокатывает, а сортировка осуществляется по полям, отсутствующим на выходе.

Прелестно!
И что, получается?
Можете показать план такого запроса, выдающего правильный результат?

Даже если Вам кажется что это работает так, как вы ожидаете, отнюдь не факт что так будет всегда.
Distinct потому и запрещает использовать в order by не используемые в select-листе выражения, что один из способов обеспечения неповторяемости строк - сортировка. Другими словами для получения distinct сервер вполне может пересортировать исходный набор, как ему заблагорассудится.

Это сообщение отредактировал(а) Zloxa - 29.9.2010, 12:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
KOHCEPBATOP
Дата 29.9.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: нет
Всего: 1



Zloxa, ёрничать мы все умеем. А по существу что-нибудь написать можете?
PM MAIL   Вверх
Zloxa
Дата 29.9.2010, 13:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



KOHCEPBATOP, не по существу в моем посте было только слово "прелестно". Извините, если сочли мою иронию оскорбительной для себя.

Добавлено @ 13:12
Меня действитеьно удивляет получение Вами ожидаемого результата, и мне действительно интересен план запроса  при котором это происходит.

Это сообщение отредактировал(а) Zloxa - 29.9.2010, 13:13


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 29.9.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



KOHCEPBATOP
Объясните мне различие между
Код

select top 100 percent * 
from tbl 
order by fld

и 
Код

select * from tbl
order by fld

Я понял бы, будь там 1%, 10% или ещё что... но наличие цифры 100% полностью выбивает меня из колеи - я не могу постичь всю глубину Вашей мысли.

PS. Почему-то вспоминается термин "индусский код".


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 29.9.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  29.9.2010,  16:22 Найти цитируемый пост)
я не могу постичь всю глубину Вашей мысли.

Он надестся получить в результате distinct выборку, отсортированную по полю, не перечисленному в списке select.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 29.9.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Zloxa @  29.9.2010,  17:35 Найти цитируемый пост)
получить в результате distinct выборку, отсортированную по полю, не перечисленному в списке select. 

 smile Но это же невозможно в принципе.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 29.9.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Akina @  29.9.2010,  17:51 Найти цитируемый пост)
 в принципе

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

select field1,field2,...fieldN
from talbe
group by field1,field2,...fieldN
order by min(OrderField)


Но вопрос ведь был не о том, вопорс был "почему  order by в подзапросе с TOP можно".


Это сообщение отредактировал(а) Zloxa - 29.9.2010, 20:25


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
KOHCEPBATOP
Дата 30.9.2010, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: нет
Всего: 1



Переделал запрос поменяв местами distinct и order by. Хотя вопрос был не в этом. Фишку про "order by" и "top 100 percent", во вложенном запросе понял.

P.S. Zloxa, Akina, не ругайтесь сильно. Не все сразу начинают писать рабочий код.
PM MAIL   Вверх
Akina
Дата 30.9.2010, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Я не ругаюсь... просто "дай мне первые сто процентов" - уж больно забавно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 30.9.2010, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(KOHCEPBATOP @  30.9.2010,  07:29 Найти цитируемый пост)
Переделал запрос поменяв местами distinct и order by.

И насколько это приблизило Вас к намеченной цели?

Описывайте цель, а не отдельный шаг


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
KOHCEPBATOP
Дата 1.10.2010, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 21.4.2010

Репутация: нет
Всего: 1



Цитата(Akina @  30.9.2010,  07:37 Найти цитируемый пост)
Я не ругаюсь... просто "дай мне первые сто процентов" - уж больно забавно. 
Меня это тоже "позабавило".


Цитата(Zloxa @  30.9.2010,  08:58 Найти цитируемый пост)
Цитата(KOHCEPBATOP @  30.9.2010,  07:29 Найти цитируемый пост)
Переделал запрос поменяв местами distinct и order by.

И насколько это приблизило Вас к намеченной цели?

В контексте данной темы - ни на сколько. В плане получения результата - на 100 percent.

Я изучаю SQL, поэтому хочу въехать в логику запросов. А совет добавить "top 100 percent" выбило меня из колеи. 
В общем понял, что лучше переделать запрос, чем пользоваться таким извратом. А просить других написать правильный запрос не лучший способ обучения.



PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.5103 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.