Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Первая и последняя строка в таблице.  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
Что-то загнался...
Не охото использовать Union.
Можно другим способом?
18 фев 16, 18:16    [18837329]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
Crimean
Member

Откуда:
Сообщений: 13148
а какая разница? ну, можно OR, а не UNION, а толку?
18 фев 16, 18:19    [18837343]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
Crimean,

Выборка большая, не охото дублировать ее, вот и думал может есть какой инструмент для таких случаев?!
18 фев 16, 18:22    [18837360]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
o-o
Guest
так первая и последняя строки в выборке или в таблице?
и зачем дублировать, нужен индекс на то, что у вас определяет порядок (id? data?)
и выбрать топ 1 с asc, desc.
и UNION ALL, да, а что с ним не то?
18 фев 16, 18:33    [18837405]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
o-o
так первая и последняя строки в выборке или в таблице?
и зачем дублировать, нужен индекс на то, что у вас определяет порядок (id? data?)
и выбрать топ 1 с asc, desc.
и UNION ALL, да, а что с ним не то?
Если строка одна, то выдаст две!
18 фев 16, 18:35    [18837417]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
o-o
Guest
он сказал
mishanya3624
Выборка большая
18 фев 16, 18:38    [18837430]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
Crimean
Member

Откуда:
Сообщений: 13148
iap
Если строка одна, то выдаст две!


тогда UNION без ALL, делов-то
18 фев 16, 18:47    [18837460]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
o-o
так первая и последняя строки в выборке или в таблице?
и зачем дублировать, нужен индекс на то, что у вас определяет порядок (id? data?)
и выбрать топ 1 с asc, desc.
и UNION ALL, да, а что с ним не то?

в таблице
да все с ним то:) все работает как надо, но ... я уже понял что он и останется:)
Всем спасибо.
18 фев 16, 18:52    [18837484]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
Crimean,

так тоже пробовал, вариант...
надо по планам посмотреть, что менее дорогое.
18 фев 16, 18:54    [18837489]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
invm,

а декартово произведение упустил что-то...
Спасибо!
19 фев 16, 12:47    [18840459]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
mishanya3624
invm,

а декартово произведение упустил что-то...
Спасибо!
А если так переписать, то это тоже декартово произведение будет?
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]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
o-o
Guest
iap
mishanya3624
invm,

а декартово произведение упустил что-то...
Спасибо!
А если так переписать, то это тоже декартово произведение будет?
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;

так просто результат пустой будет.
ну или только если там всего 1 строка, то да, оба id одинаковы
19 фев 16, 13:03    [18840586]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
o-o
iap
пропущено...
А если так переписать, то это тоже декартово произведение будет?
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;


так просто результат пустой будет.
ну или только если там всего 1 строка, то да, оба id одинаковы
Там же OR! Прошу прощения!
19 фев 16, 13:04    [18840594]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
iap
mishanya3624
invm,

а декартово произведение упустил что-то...
Спасибо!
А если так переписать, то это тоже декартово произведение будет?
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;

найн:)
но итог один:)
но выполнение с joinами затратнее выходят, оставлю union.
19 фев 16, 13:43    [18840950]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
mishanya3624
iap
пропущено...
А если так переписать, то это тоже декартово произведение будет?
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;


найн:)
но итог один:)
но выполнение с joinами затратнее выходят, оставлю union.
Конечно нет. Это же неправильно. Уже ткнули меня носом.
19 фев 16, 13:49    [18840985]     Ответить | Цитировать Сообщить модератору
 Re: Первая и последняя строка в таблице.  [new]
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 Ответить