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

Откуда:
Сообщений: 75
Добрый день.

есть данные:

id owher name
53 52 Михаил
54 53 Денис
55 53 Степан
56 54 Подчиненный дениса
58 54 Подчиненный дениса2
57 53 Подчиненный степана


нужно что бы получилось вот так

id owher name
53 52 Михаил
54 53 Денис
56 54 Подчиненный дениса
58 54 Подчиненный дениса2
55 53 Степан
57 53 Подчиненный степана

т.е. по сути нужно отсортировать данные одновремено по id и owher
2 дек 15, 15:32    [18503610]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Боровиков Степан
Member

Откуда:
Сообщений: 75
немного ошибся в поле владельца.
вот исправленный данные.

id owher name
53 52 Михаил
54 53 Денис
55 53 Степан
56 54 Подчиненный дениса
58 54 Подчиненный дениса2
57 55 Подчиненный степана


нужно что бы получилось вот так

id owher name
53 52 Михаил
54 53 Денис
56 54 Подчиненный дениса
58 54 Подчиненный дениса2
55 53 Степан
57 55 Подчиненный степана

Что просил с часа два не могу сообразить.

Помогите плиз.
2 дек 15, 15:40    [18503692]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Боровиков Степан,

и каков закон сортировки?
2 дек 15, 15:59    [18503789]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Понял, надо выделить ветки и отсортировать их как единое целое по корневым ID.
2 дек 15, 16:03    [18503826]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Боровиков Степан,

with pretable as
(select *
from (values (52, null, ''),
	(53, 52, 'Михаил'),
(54, 53, 'Денис'),
(55, 53, 'Степан'),
(56, 54, 'Подчиненный дениса'),
(58, 54, 'Подчиненный дениса2'),
(57, 53, 'Подчиненный степана')) as pretable (id, owner, name))
,cte as
(select id, owner, name, cast(id as nvarchar(max)) as path_ from pretable where owner is null
union all
select pretable.id, pretable.owner, pretable.name, cte.path_ + '\' + cast(pretable.id as nvarchar(max)) from pretable inner join cte on pretable.owner = cte.id)
select id, owner, name from cte order by path_
2 дек 15, 16:06    [18503848]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Напишите рекурсивный CTE, который будет формировать символьный столбец для сортировки вида:

автор
53 52 Михаил " 53 "
54 53 Денис " 53 54 "
56 54 Подчиненный дениса " 53 54 56 "
58 54 Подчиненный дениса2 " 53 54 58 "
55 53 Степан " 53 55 "
57 55 Подчиненный степана " 53 55 57 "
2 дек 15, 16:18    [18503935]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Minamoto, кстати, в случае, если количество знаков в id разное (что наверняка так и есть), код сработает некорректно, например, дочерние от одного родителя записи с id = 2 и 15 будут сортироваться неправильно - сначала выведется строка с id = 15, потом - с id = 2.

Поэтому id в path_ нужно будет добить лидирующими нулями - в универсальном случае до 10 знаков в случае, если id - int или до 19 в случае, если id - bigint.
2 дек 15, 16:46    [18504097]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Я ж так и нарисовал пробелами добить слева каждое число. :) Достаточно использовать STR().
2 дек 15, 17:00    [18504170]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Minamoto
Поэтому id в path_ нужно будет добить лидирующими нулями - в универсальном случае до 10 знаков в случае, если id - int или до 19 в случае, если id - bigint.
Проще всего их добить пробелами функцией STR(id,10).
А я бы вообще переводил int в binary(4) - это быстрее, и ключи получаются компактнее.
2 дек 15, 17:01    [18504178]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Serg_77m, а как двоичные отображать на интерфейсе?
2 дек 15, 17:24    [18504262]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Serg_77m, спасибо, подытожу тогда:

with pretable as
(
	select	*
	from  (	values	(52, null, ''),
					(53, 52, 'Михаил'),
					(54, 53, 'Денис'),
					(55, 53, 'Степан'),
					(56, 54, 'Подчиненный дениса'),
					(58, 54, 'Подчиненный дениса2'),
					(57, 53, 'Подчиненный степана')
			) as pretable (id, owner, name)
), cte as
(
	select	id, owner, name
		,	convert(varchar(max), cast(id as varbinary(4)), 2) as path_ 
	from	pretable 
	where	owner is null
	union all
	select	pretable.id, pretable.owner, pretable.name
		,	cte.path_ + '\' + 
			convert(varchar(max), cast(pretable.id as varbinary(4)), 2) 
	from	pretable 
			inner join cte 
					on pretable.owner = cte.id
)
select	id, owner, name
from	cte 
order by path_
2 дек 15, 17:35    [18504304]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Владислав Колосов
Serg_77m, а как двоичные отображать на интерфейсе?
Вроде бы отображать их здесь и не надо. Вставить в ORDER BY, да и всё.
2 дек 15, 17:36    [18504313]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Владислав Колосов
Member

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

я думал, что есть способ :) Идея привлекательная.
2 дек 15, 17:39    [18504340]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Serg_77m
Member

Откуда: Донецк
Сообщений: 237
Minamoto
Serg_77m, спасибо, подытожу тогда
Тогда уже convert(varbinary(max), ...) вместо convert(varchar(max), ...).

А вообще-то, у меня есть подозрение, что сортировка должна быть не по порядку id, а по именам. Тогда придётся ещё и искусственные номера городить... или имена добивать пробелами справа и в длинную строчку клеить.
2 дек 15, 17:41    [18504355]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Владислав Колосов, есть способ - возьмите мой пример и выведите path_ в последнем примере - увидите.
2 дек 15, 17:42    [18504356]     Ответить | Цитировать Сообщить модератору
 Re: select с учетом владельца  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Serg_77m
А вообще-то, у меня есть подозрение, что сортировка должна быть не по порядку id, а по именам. Тогда придётся ещё и искусственные номера городить... или имена добивать пробелами справа и в длинную строчку клеить.

Подозрение опровергается вот этой цитатой из ТСа:

Боровиков Степан
т.е. по сути нужно отсортировать данные одновремено по id и owher
2 дек 15, 17:44    [18504373]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить