|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
всё руки не доходили запостить, но всплыл пару недель назад один из старых У него перестал работать запрос, проблема оказалась в том, что если идёт присвоение переменной в запросе и стоит оператор order by, то присваивается только первая переменная. Если поставить top, то всё работает как надо Вот тест кейс, коментим ТОП и смотрим результат. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 11:51 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
авторУ него перестал работать запрос А кто-то обещал, что такой запрос впринципе должен работать так, как мы того ожидаем? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 11:53 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
Банальная конкатенация строк. set @v = @v + t.value я как бы "ожидал". Причём без "оредер бай" работает. Либо с ТОП работает. После добавление Ордер бай я бы ожидал "тот же результат с другим порядком". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 11:57 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKя как бы "ожидал". Причём без "оредер бай" работает. Либо с ТОП работает. После добавление Ордер бай я бы ожидал "тот же результат с другим порядком". На чем основаны были ожидания ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 11:59 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKБанальная конкатенация строк. set @v = @v + t.value В вашем примере не банальная конкатенация, а недокументированный приём. Нигде не зафиксировано, как это должно работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 11:59 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
GloryNIIIKя как бы "ожидал". Причём без "оредер бай" работает. Либо с ТОП работает. После добавление Ордер бай я бы ожидал "тот же результат с другим порядком". На чем основаны были ожидания ? На том что "без ордер бай работало, но нужно было плучить тот же результат только в другом порядке и том что ордер бай не изменяет количество строк, что кстати хорошо видно в подзапросах которые должны возврщать только одну строку). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:02 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
Гость333NIIIKБанальная конкатенация строк. set @v = @v + t.value В вашем примере не банальная конкатенация, а недокументированный приём. Нигде не зафиксировано, как это должно работать. Прям хакерский приём :) ?! Я сейчас не про факт конкатенации говорю (хотя явно не в курсорах обычно реализуют её), а про количество строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:03 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
Гость333NIIIKБанальная конкатенация строк. set @v = @v + t.value В вашем примере не банальная конкатенация, а недокументированный приём. Нигде не зафиксировано, как это должно работать. + это должно работать "одинаково" и нигде не зафиксировано что присваивание переменных в запросе делается "по первой строке если стоит ордер бай". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:04 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
tpg http://www.sql.ru/faq/faq_topic.aspx?fid=731 Для случая с группировкой я предпочитаю CLR функцию. Тот метод кстати медленее работает. По быстродействую сопостовим "тупо написать отдельную функци делающую отдельный запрос и конкатенацию)" если не медленее. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:08 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIK+ это должно работать "одинаково" и нигде не зафиксировано что присваивание переменных в запросе делается "по первой строке если стоит ордер бай". BOL SELECT @local_variable is typically used to return a single value into the variable. However, when expression is the name of a column, it can return multiple values. If the SELECT statement returns more than one value, the variable is assigned the last value that is returned . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:10 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
> это должно работать "одинаково" это кто сказал? > и нигде не зафиксировано что присваивание переменных в запросе делается "по первой строке если стоит ордер бай". давно уж расписались в том, что результат запроса, подобного вашему неопределен. http://support.microsoft.com/kb/287515/en-us ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:11 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKНа том что "без ордер бай работало, но нужно было плучить тот же результат только в другом порядке и том что ордер бай не изменяет количество строк, что кстати хорошо видно в подзапросах которые должны возврщать только одну строку). Молодец. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:13 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKПрям хакерский приём :) ?! Я сейчас не про факт конкатенации говорю (хотя явно не в курсорах обычно реализуют её), а про количество строк. Недокументированный приём — это запрос вида Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:17 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
GloryNIIIK+ это должно работать "одинаково" и нигде не зафиксировано что присваивание переменных в запросе делается "по первой строке если стоит ордер бай". BOL SELECT @local_variable is typically used to return a single value into the variable. However, when expression is the name of a column, it can return multiple values. If the SELECT statement returns more than one value, the variable is assigned the last value that is returned . До "last value" оно и не дошло Разницу вообще все без "top" и "заведомо большой Top" видят ?! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:39 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKРазницу вообще все без "top" и "заведомо большой Top" видят ?! Разницу между "я хочу, чтобы так работало" и "так работает" тоже кто-то видит ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:43 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
GloryNIIIKРазницу вообще все без "top" и "заведомо большой Top" видят ?! Разницу между "я хочу, чтобы так работало" и "так работает" тоже кто-то видит ? Вы эксперт местный или "адвокат майкрософта" ?! Документация на оператор Топ есть? должен ли заведомо большой оператор топ изменять количество строк в запросе или результат запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:53 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKДокументация на оператор Топ есть? А документация на select @v = @v + t.value есть ? NIIIKдолжен ли заведомо большой оператор топ изменять количество строк в запросе или результат запроса? Причем тут количество записей ? Меняется план выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 12:55 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5.
такой вариант тоже работет, только порядок "алфавитный" (собственно его и фиксили). ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:10 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKУ него перестал работать запрос, проблема оказалась в том, что если идёт присвоение переменной в запросе и стоит оператор order by, то присваивается только первая переменная . Если поставить top, то всё работает как надо Вот тест кейс, коментим ТОП и смотрим результат. <...> что-то не сходится с вашим утверждением закомментил TOP, добавил вывод остальных трех переменных, на выходе max(case r.QID when '5.5.21' then r.answer end) as "QID_5.5.21" c."QID_5.5.21" max(case r.QID when '5.5.21' then r.BP_ID end) as "BP_5.5.21" c."BP_5.5.21" т.е., все четыре переменных получают значения ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:15 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
ShakillNIIIKУ него перестал работать запрос, проблема оказалась в том, что если идёт присвоение переменной в запросе и стоит оператор order by, то присваивается только первая переменная . Если поставить top, то всё работает как надо Вот тест кейс, коментим ТОП и смотрим результат. <...> что-то не сходится с вашим утверждением закомментил TOP, добавил вывод остальных трех переменных, на выходе max(case r.QID when '5.5.21' then r.answer end) as "QID_5.5.21" c."QID_5.5.21" max(case r.QID when '5.5.21' then r.BP_ID end) as "BP_5.5.21" c."BP_5.5.21" т.е., все четыре переменных получают значения 1) у меня тоже получается только последняя . тут моя ошибка, я по запарке (и было не вчера) в голове отложил только как заказчик говорил 2) если стоит топ и ордер - возвращает ВСЕ записи 3) если только ордер (по цифрам) БЕЗ Топ - возвращает только первую запись 4) если стоит ордер БЕЗ топ, но по имени - возвращает все записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:21 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIK1) у меня тоже получается только последняя . тут моя ошибка, я по запарке (и было не вчера) в голове отложил только как заказчик говорил 2) если стоит топ и ордер - возвращает ВСЕ записи 3) если только ордер (по цифрам) БЕЗ Топ - возвращает только первую запись 4) если стоит ордер БЕЗ топ, но по имени - возвращает все записи. Для неумеющих читать офф.ссылки An examination of the SHOWPLAN output of the query reveals that the SQL Server query p rocessor builds an different execution plan when expressions are applied to columns in the query's ORDER BY clause, than when those same expressions are applied to columns in the query's SELECT list. The decision made by the query processor is based on the cost of possible execution plans . ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:24 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
Glory, План выполнения - это путь достижения постоянного результата. Завтра план может поменятся по другой причине (статистика, данные, новый индекс для другого запроса изначально). Оператор order by - не должен влиять на количество выводимых строк (не одним датастом, а обрабатываемых, как и в курсоре). Разарабочик не должен думать о том что "если я измению порядок у меня изменится количество". Оператор TOP ... НЕ ДОЛЖЕН возвращать больше строк чем БЕЗ этого оператора. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:32 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKОператор order by - не должен влиять на количество выводимых строк (не одним датастом, а обрабатываемых, как и в курсоре). Оператор TOP ... НЕ ДОЛЖЕН возвращать больше строк чем БЕЗ этого оператора. Да причем тут количество записей ? Вы меняете текст запроса. И оптимизатор вправе поменять план выполнения Конкретно в данном случае меняется положение в плане шагов сортировки и вычисления выражений. Вы хоть какой то план выполнения смотрели ? NIIIKПлан выполнения - это путь достижения постоянного результата. Для постоянного результата нужно использовать документированные методы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:37 |
|
TOP + ORDER BY
|
|||
---|---|---|---|
#18+
NIIIKGlory, План выполнения - это путь достижения постоянного результата. Завтра план может поменятся по другой причине (статистика, данные, новый индекс для другого запроса изначально). Оператор order by - не должен влиять на количество выводимых строк (не одним датастом, а обрабатываемых, как и в курсоре). Разарабочик не должен думать о том что "если я измению порядок у меня изменится количество". Оператор TOP ... НЕ ДОЛЖЕН возвращать больше строк чем БЕЗ этого оператора.Если всё это относится к обсуждаемой конструкции конкатенации строк, то никто никому ничего не должен! Говоря Вашими словами, "разарабочик не должен" применять эту недокументированную конструкцию ввиду её нестабильной непредсказуемой работы. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2013, 13:38 |
|
|
start [/forum/topic.php?fid=46&tid=1708039]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
184ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 532ms |
0 / 0 |