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

Откуда:
Сообщений: 75
Здравствуйте !
Есть одна таблица договоров (id_contract, parent_id,name) всего двух уровненная.
Как сделать в одном запросе, чтобы сначала шел основной договор, а потом дополнительный?

1 договор А (основной)
2 поддоговор1 А
3 поддоговор2 А
4 договор Б (основной)
5 поддоговор1 Б
6 поддоговор2 Б

в одном результате.
8 авг 12, 14:10    [12981689]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
qwerty112
Guest
Евгений_lea
Здравствуйте !
Есть одна таблица договоров (id_contract, parent_id,name) всего двух уровненная.
Как сделать в одном запросе, чтобы сначала шел основной договор, а потом дополнительный?

1 договор А (основной)
2 поддоговор1 А
3 поддоговор2 А
4 договор Б (основной)
5 поддоговор1 Б
6 поддоговор2 Б

в одном результате.

order by isnull(parent_id, id_contract), parent_id, id_contract
8 авг 12, 14:18    [12981758]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
Евгений_lea
Member

Откуда:
Сообщений: 75
select * From contracts
order by isnull(parent_id, id_contract), parent_id, id_contract

не работает, сначала вышли все основные, а потом дочерние.
8 авг 12, 14:25    [12981826]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Евгений_lea
select * From contracts
order by isnull(parent_id, id_contract), parent_id, id_contract

не работает, сначала вышли все основные, а потом дочерние.

;WITH T
AS
(
 SELECT  1 ID , NULL PID
 UNION ALL
 SELECT  11 ID , 1 PID
  UNION ALL
 SELECT  12 ID , 1 PID
 UNION ALL
 SELECT  2 ID , NULL PID
 UNION ALL
 SELECT  21 ID , 2 PID
 UNION ALL
 SELECT  22 ID , 2 PID
  
)
,R 
AS
(
  SELECT ID, PID , CONVERT( VARCHAR(16), T.ID ) [PATH] FROM T WHERE PID IS NULL
  UNION ALL 
  SELECT T.ID, T.PID , CONVERT( VARCHAR(16),R.[PATH]+'.'+CONVERT( VARCHAR(16), T.ID )) [PATH] FROM T
   INNER JOIN R ON T.PID = R.ID 
  
  
)
SELECT R.ID, R.PID FROM R
ORDER BY [PATH]
8 авг 12, 14:26    [12981835]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
qwerty112
Guest
Евгений_lea
select * From contracts
order by isnull(parent_id, id_contract), parent_id, id_contract

не работает, сначала вышли все основные, а потом дочерние.

не работают - негры в Африке !

на каких данных - "не работает" ?
что у тебя в поле parent_id для "основной договор" ? "0" ?
на пример данных - мозгов силов не хватило ??
;WITH T
AS
(
 SELECT  1 ID , 0 PID
 UNION ALL
 SELECT  11 ID , 1 PID
  UNION ALL
 SELECT  12 ID , 1 PID
 UNION ALL
 SELECT  2 ID , 0 PID
 UNION ALL
 SELECT  21 ID , 2 PID
 UNION ALL
 SELECT  22 ID , 2 PID
  
)

select * from T
order by /*isnull(PID,ID)*/ case when PID=0 then ID else PID end, PID, ID

ID          PID
----------- -----------
1           0
11          1
12          1
2           0
21          2
22          2

(6 row(s) affected)
8 авг 12, 14:34    [12981910]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
Евгений_lea
Member

Откуда:
Сообщений: 75
Благодарю, работает правильно. Спасибо.
8 авг 12, 14:38    [12981935]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Евгений_lea,

Можете использовать способ описанный выше, только помните что надо делать в виде "001.021.003"

20 по алфавиту идут после 100 и вам надо иметь максимальную разрядность и "0020" тогда будет перед "0100"

Так же хорошая штука это тип hierarchyid, соритрует и быстро и без рекурсивных запросов если заведомо есть.
8 авг 12, 17:13    [12983304]     Ответить | Цитировать Сообщить модератору
 Re: Иерархическая сортировка одной таблицы  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
NIIIK
Евгений_lea,

Можете использовать способ описанный выше, только помните что надо делать в виде "001.021.003"

20 по алфавиту идут после 100 и вам надо иметь максимальную разрядность и "0020" тогда будет перед "0100"

Так же хорошая штука это тип hierarchyid, соритрует и быстро и без рекурсивных запросов если заведомо есть.

Это, да, однако вставка и удаление узлов - на коде.
8 авг 12, 18:03    [12983681]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить