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

Дана таблица некой иерархической классификации:
ID Parent
1 0
2 1
3 2
10 0
11 0
22 11

,где ID - уникальный код(начинается с 1), Parent - родитель. Необходимо выбрать все конечные дочерние записи(если они имеются), что должно получиться:
ID Parent
3 2
10 0
22 11

Спасибо за помощь.
27 июн 14, 19:53    [16231069]     Ответить | Цитировать Сообщить модератору
 Re: помогите с выборкой  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
select
 *
from
 Таблица t
where
 not exists(select 1 from Таблица where Parent = t.ID);
27 июн 14, 20:27    [16231158]     Ответить | Цитировать Сообщить модератору
 Re: помогите с выборкой  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
steeker,

SELECT t1.ID, t1.PARENT
FROM T t1 
LEFT JOIN t2 ON t2.PARENT = t1.ID
WHERE t2.PARENT IS NULL 
27 июн 14, 20:28    [16231162]     Ответить | Цитировать Сообщить модератору
 Re: помогите с выборкой  [new]
steeker
Guest
a_voronin
steeker,

SELECT t1.ID, t1.PARENT
FROM T t1 
LEFT JOIN t2 ON t2.PARENT = t1.ID
WHERE t2.PARENT IS NULL 


Огромное спасибо!
27 июн 14, 20:45    [16231207]     Ответить | Цитировать Сообщить модератору
 Re: помогите с выборкой  [new]
user89
Member

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

через рекурсию
declare @t table (id int, Parent int)
insert @t values(1,0), (2,1), (3,2), (10,0), (11,0), (22,11)

;with a as (
  select id, Parent, 0 [lev], row_number() over(order by (select(0))) [gr] from @t where Parent = 0
  union all
  select t.id, t.Parent, lev+1, gr
  from @t t
  inner join a on t.Parent = a.id
)
select top 1 with ties
id, Parent from a
order by row_number() over(partition by gr order by lev desc)
27 июн 14, 22:31    [16231599]     Ответить | Цитировать Сообщить модератору
 Re: помогите с выборкой  [new]
steeker
Guest
А если исключить, например ID = 3 и ID = 22 (where ID not in (3, 22)), что бы получились такие данные:
2 1
10 0
11 0
?
28 июн 14, 01:41    [16232182]     Ответить | Цитировать Сообщить модератору
 Re: помогите с выборкой  [new]
user89
Member

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

не совсем понятно... Если вывести записи с предпоследним уровнем, то так
declare @t table (id int, Parent int)
insert @t values(1,0), (2,1), (3,2), (10,0), (11,0), (22,11)

;with a as (
  select id, Parent, 0 [lev], row_number() over(order by (select(0))) [gr] from @t where Parent = 0
  union all
  select t.id, t.Parent, lev+1, gr
  from @t t
  inner join a on t.Parent = a.id
), b as (
  select *, isnull(nullif(max(lev) over(partition by gr)-1,-1),0) [maxLev_1] from a
)
select * from b
where lev = maxLev_1
28 июн 14, 14:01    [16233046]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить