Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
mishanya3624 Member Откуда: Сообщений: 796 |
Что-то загнался... Не охото использовать Union. Можно другим способом? |
18 фев 16, 18:16 [18837329] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13148 |
а какая разница? ну, можно OR, а не UNION, а толку? |
18 фев 16, 18:19 [18837343] Ответить | Цитировать Сообщить модератору |
mishanya3624 Member Откуда: Сообщений: 796 |
Crimean, Выборка большая, не охото дублировать ее, вот и думал может есть какой инструмент для таких случаев?! |
18 фев 16, 18:22 [18837360] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
так первая и последняя строки в выборке или в таблице? и зачем дублировать, нужен индекс на то, что у вас определяет порядок (id? data?) и выбрать топ 1 с asc, desc. и UNION ALL, да, а что с ним не то? |
18 фев 16, 18:33 [18837405] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
![]() |
||
18 фев 16, 18:35 [18837417] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
он сказал
|
||
18 фев 16, 18:38 [18837430] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13148 |
тогда UNION без ALL, делов-то |
||
18 фев 16, 18:47 [18837460] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13148 |
аааа... может тут проблема? with cte as ( большая выборка ) select top 1 * from cte order by id asc union select top 1 * from cte order by id desc |
18 фев 16, 18:48 [18837468] Ответить | Цитировать Сообщить модератору |
mishanya3624 Member Откуда: Сообщений: 796 |
в таблице да все с ним то:) все работает как надо, но ... я уже понял что он и останется:) Всем спасибо. |
||
18 фев 16, 18:52 [18837484] Ответить | Цитировать Сообщить модератору |
mishanya3624 Member Откуда: Сообщений: 796 |
Crimean, так тоже пробовал, вариант... надо по планам посмотреть, что менее дорогое. |
18 фев 16, 18:54 [18837489] Ответить | Цитировать Сообщить модератору |
Crimean Member Откуда: Сообщений: 13148 |
ну вот этот вариант вряд ли дешевле будет: select * from MyTable where id in ( (select top 1 id from MyTable order by id ASC) , (select top 1 id from MyTable order by id DESC) ) хотя, возможно что и получится на индексах сыграть, если искать первую / последнюю по не-кластерному, а после делать SELECT * уже по кластерному. |
18 фев 16, 19:06 [18837530] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
При наличии индексаselect t.* from MyTable t cross join (select top (1) id from MyTable order by id) a(id) cross join (select top (1) id from MyTable order by id desc) b(id) where t.id = a.id or t.id = b.id; |
18 фев 16, 20:07 [18837748] Ответить | Цитировать Сообщить модератору |
mishanya3624 Member Откуда: Сообщений: 796 |
invm, а декартово произведение упустил что-то... Спасибо! |
19 фев 16, 12:47 [18840459] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
select t.* from MyTable t join (select top (1) id from MyTable order by id) a(id) on t.id = a.id join (select top (1) id from MyTable order by id desc) b(id) on t.id = b.id; |
||
19 фев 16, 12:53 [18840510] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
так просто результат пустой будет. ну или только если там всего 1 строка, то да, оба id одинаковы |
||||
19 фев 16, 13:03 [18840586] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
|
||||
19 фев 16, 13:04 [18840594] Ответить | Цитировать Сообщить модератору |
felix_ff Member Откуда: Moscow Сообщений: 1688 |
если критерий уникальности определяющий порядок строк например поле с identity и мы знаем что никаких identity_insert не предполагается, написал бы так:declare @tbl table (id int identity(1,1), value varchar(255)) insert into @tbl (value) values ('test1'), ('test2'), ('test3'), ('test4'), ('test5') ;with min_max (id_min, id_max) as ( select MIN(id), MAX(id) from @tbl ) select t.* from @tbl t join min_max m on t.id in (m.id_min, m.id_max) |
19 фев 16, 13:39 [18840918] Ответить | Цитировать Сообщить модератору |
mishanya3624 Member Откуда: Сообщений: 796 |
найн:) но итог один:) но выполнение с joinами затратнее выходят, оставлю union. |
||||
19 фев 16, 13:43 [18840950] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
|
||||
19 фев 16, 13:49 [18840985] Ответить | Цитировать Сообщить модератору |
baza906 Member Откуда: Сообщений: 283 |
Вставлю свои 5 копеек. В соревновании между 2 запросами к таблице с 3276800 строк, 2 столбцами и без индекса: --Вариант №1 WITH cte AS ( SELECT id,vv FROM [export_test].[dbo].[first_t_no_index] ) SELECT id,vv FROM ( SELECT TOP 1 * FROM cte ORDER BY id ASC ) s UNION SELECT id,vv FROM ( SELECT TOP 1 * FROM cte ORDER BY id DESC ) s --Вариант №2 WITH cte AS ( SELECT * ,row_number() OVER (PARTITION BY 1 ORDER BY id ASC) f ,row_number() OVER (PARTITION BY 1 ORDER BY id DESC ) l FROM [export_test].[dbo].[first_t_no_index] ) SELECT id,vv FROM cte WHERE f = 1 UNION SELECT id,vv FROM cte WHERE l = 1 победил запрос №1 При тех же условиях и кластеризованном индексе на id разницы на таком количестве строк не заметил |
19 фев 16, 14:46 [18841370] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |