SQL - Как получить Treeview GrandParent, Parent, Child по идентификатору - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть 2 таблицы, где таблица Customer содержит данные о клиентах, а таблица отношений содержит отношения с клиентом.

CREATE Table Customer  
(  
  id int,  
  name nvarchar(10)  
)

INSERT INTO Customer Values  
(1, 'aaa'),  
(2, 'bbb'),  
(3, 'ccc'),  
(4, 'ddd'),  
(5, 'eee'),  
(6, 'fff'),  
(7, 'ggg'),  
(8, 'hhh'),  
(9, 'iii'),  
(10, 'jjj'),  
(11, 'kkk'),  
(12, 'lll')  

CREATE TABLE Relations  
(  
  id int,  
  parentid int  
)  

INSERT INTO Relations VALUES  
  (2,  1),  
  (3,  1),  
  (4,  2),  
  (5,  2),  
  (6,  1),  
  (7,  4),  
  (8,  5),  
  (9,  8),  
  (10, 8),  
  (12, 7)  

Я хочу найти GrandParent, Parent и child по идентификатору.Например: если я хочу найти все отношения ID = 4, я должен получить результат в следующем формате.Заказывается Grand Parent вверху, если у ID есть родитель или Grand parent.Если нет, то он должен показать ребенка с этим удостоверением личности.

Grand Parent | aaa
Parent | bbb
Child | ggg
Child | lll

Не могли бы вы, пожалуйстаПомогите мне с вышеуказанным запросом в «SQL Server».

1 Ответ

0 голосов
/ 23 сентября 2019

Вы можете использовать рекурсивные CTE (Common Table Expressions) для получения этой информации.Например, для ID = 4 вы можете сделать:

with
a as ( -- get ancestors
  select 0 as lvl, id, name from customer where id = 4
  union all 
  select a.lvl - 1, c.id, c.name
  from a
  join relations r on a.id = r.id
  join customer c on c.id = r.parentid
),
d as ( -- get descendants
  select 0 as lvl, id, name from customer where id = 4
  union all 
  select d.lvl + 1, c.id, c.name
  from d
  join relations r on d.id = r.parentid
  join customer c on c.id = r.id
)
select lvl, id, name from a
union 
select lvl, id, name from d
order by lvl

Результат:

lvl  id  name
---  --  ----
 -2   1  aaa 
 -1   2  bbb 
  0   4  ddd 
  1   7  ggg 
  2  12  lll
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...