Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
Приветствую, господа! Есть удаленный сервер sql2000, к нему обращается sql2016 через линк. На 2000м оконок нет, а задача такова, что нужно из группы получить только первые значения, поэтому 2000й возвращает всё, как есть, а на стороне 2016 применяется оконка и доводит результат до нужного вида. Т.к. удаленный сервер находится в другом городе и к нему идет обращение через интернеты, хотелось бы сократить объем передаваемых данных. Оконке для сортировки требуются дополнительные поля, которые мне в результирующем наборе не нужны. Поэтому я решил выполнить сортировку на стороне удаленного сервера, а в оконке уже не применять никакой сортировки, это позволит не передавать лишние поля. Но вот не уверен, гарантирует ли это тот же самый результат? Т.е. равнозначны ли будут результаты, если применить сортировку на удаленном сервере, а в оконке этого не делать в сравнении с запросом, где сортировка будет выполняться внутри оконки, а не на удаленном сервере. На первый взгляд кажется, что результаты идентичны, но нет ли тут подводных камней, типа как с конструкцией select * from t1 where f1 in (select f1 from t2), если в t2 вдруг окажутся значения null.
|
|
26 апр 17, 10:27 [20434842] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
TJ001, без "оконке" и пронумеровать не могут уже :) |
26 апр 17, 10:37 [20434887] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
1. Проблемы не в null, а в голове select * from t1 where f1 in (select f1 from t2 where f1 is not null ) 2. Сортировки сортируют одинаково. Исключение - разные коллэйшн. |
||
26 апр 17, 10:46 [20434942] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8340 |
TJ001, насчет exists ничего не слышали? |
26 апр 17, 10:49 [20434955] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
вот странно устроены наши люди... задаешь вопрос об одном, придираются к другому для чего этот ответ? я специально привел пример именно в таком виде - без where f1 is not null, без экзистов, чтобы была видна ССуть, а как решать его я и сам знаю Владислав Колосов, вы вопрос читали? а про оффтоп слышали? меня интересует сортировка! если не можете/хотите ответить по теме, зачем вообще что-то отвечать?
Коллэйшн в моем случае не имеет значения, в реальной таблице поля типа дата и число, а char поля не содержат кириллицы, плюс ко всему коллэйшены совпадают на серверах, но это очень правильное замечание! Спасибо! |
||||||
26 апр 17, 11:13 [20435041] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9644 |
А
Считаете это эквивалентным, даже при условии, что набор уже отсортирован по F3 DESC, F2 DESC, F5 DESC, F7 DESC, F6 DESC? |
||||
26 апр 17, 11:27 [20435091] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9644 |
Ну и пример как можно обходиться без "оконок":declare @t table (a int, b int, c int); insert into @t values (3, 2, 2), (3, 1, 1), (1, 3, 3), (1, 4, 4); if object_id('tempdb..#t', 'U') is not null drop table #t; select identity(int, 1, 1) as id, a, b, c into #t from @t order by a, b, c; select a.a, a.b, a.c from #t a join (select min(id) from #t group by a) b(id) on b.id = a.id; |
26 апр 17, 11:52 [20435210] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
invm, Согласен с вашим замечанием. Теоретически так и получается, что оконка по идее должна отсортировать по F5, F2 и как при этом лягут другие поля неизвестно, но на практике не могу пока воспроизвести... |
26 апр 17, 11:58 [20435243] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
тут тоже согласен просто хотелось как-то уйти от промежуточных таблиц... спасибо за ответы! |
||
26 апр 17, 13:02 [20435614] Ответить | Цитировать Сообщить модератору |
rnk Member Откуда: Сообщений: 126 |
Можно и без временных таблиц: declare @t table (a int, b int, c int); insert into @t values (3, 2, 2), (3, 1, 1), (1, 3, 3), (1, 4, 4); with t as ( select row_number() over (order by a, b, c) as id, a, b, c from @t ) select a.a, a.b, a.c from t a join (select min(id) from t group by a) b(id) on b.id = a.id; |
||
26 апр 17, 13:23 [20435760] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
rnk, и круг замкнулся... |
26 апр 17, 13:29 [20435801] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
и 2000-ый проглотит row_number()? весь вопрос и был, как нумеровать на 2000-ом, без "оконке" |
||||
26 апр 17, 13:30 [20435814] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
o-o, вот зачем вы так, получилась бы неплохая рекурсия в вопросах :) |
26 апр 17, 13:36 [20435863] Ответить | Цитировать Сообщить модератору |
rnk Member Откуда: Сообщений: 126 |
TaPaK, Ступил, забыл,что там sql2000 на горизонте маячит... |
26 апр 17, 13:37 [20435879] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
rnk, TaPaK, да ладно, зато весело получилось )))) |
26 апр 17, 14:14 [20436080] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Там, у тредстартера, нема нужды в нумерации. Для тупых - он ПЕРВОЕ значение берет. Научите его писать коррелированные запросы и дело с концом. |
||
26 апр 17, 14:25 [20436139] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
это вы про select f1, (select top 1 f1 from t2 where t2.f2=t1.f2) ff2 from t1 where...? |
||
26 апр 17, 15:03 [20436345] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ниугадал SELECT * FROM ( SELECT F1, F2, F4, ROW_NUMBER() OVER(PARTITION BY F5, F2 ORDER BY F3 DESC, F2 DESC, F5 DESC, F7 DESC, F6 DESC) firstv, F5 FROM ##t1 ) a WHERE firstv = 1 select * from ##t1 as t where id = ( select top(1) id from ##t1 where F5 = t. F5 order by F3 DESC, F2 DESC, F5 DESC, F7 DESC, F6 DESC) |
||||
26 апр 17, 18:04 [20437269] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
aleks2, те же яйца, только сбоку опять все буквально понимаете и откуда столько гонора? ЧСВ? понятно. |
26 апр 17, 20:42 [20437706] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9644 |
|
|||
26 апр 17, 21:10 [20437794] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Дохтур, у поциента MS SQL 2000 и идиосинкразия на временные таблички. ЗЫ. Ну и, во времена MS SQL 2000 так писали и... ничо нам за это не было. |
|||||
27 апр 17, 06:46 [20438303] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Это смотря чьи яйцы. |
||
27 апр 17, 06:49 [20438305] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9644 |
|
||||
27 апр 17, 11:05 [20438995] Ответить | Цитировать Сообщить модератору |
TJ001 Member Откуда: от верблюда Сообщений: 428 |
![]() |
||
27 апр 17, 11:14 [20439042] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ээээ... мальчег, чего ты смыслишь в MS SQL 2000? ЗЫ. Ты, просто, туповат и не понимаешь, что группировка это далеко не всегда приемлемо. |
||||||
27 апр 17, 11:36 [20439202] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |