2017-02-01 3 views
3

Я использую sql 2012, и у меня есть таблица саморекламы, которая имеет 3 уровня. Структура таблицы, как показано ниже:Как получить дочерние данные из таблицы самореференций в sql

Структура таблицы

У меня есть еще одна таблица, которая ссылается эту таблицу, то есть идентификатор в качестве внешнего ключа, так что если внешний ключ к этой таблице 6 , Мне нужно показать, что 6 является «AAA», и это дочерний узел «AA», который является дочерним узлом «A». Мне нужно перейти на более низкий уровень, а с нижнего уровня я должен подняться на верхний уровень. В настоящее время я могу подняться на второй уровень.

Ниже представлена ​​структура таблицы, которая ссылается на другую таблицу.

Так что я хотел бы сообщить о них как таблицы и окончательный вывод должен выглядеть следующим образом:

Если мой вопрос не слишком ясно, пожалуйста, спросите я попытаюсь разъяснить это.

+1

опубликуйте текущую попытку и ожидаемый результат. – ADyson

+0

Возможный дубликат [CTE Recursion для получения иерархии дерева] (http://stackoverflow.com/questions/18106947/cte-recursion-to-get-tree-hierarchy) – iamdave

+0

Почему вы не используете 'hierarchyid'? Установлено ли количество уровней? Если это так, вам не нужна рекурсия или CTE, только 3 сам присоединяется. Код будет проще и производительность намного быстрее, чем CTE –

ответ

0

Предполагая, что глубина дерева категорий составляет не более 3 уровней, это должно работать:

declare @Catergory table (
    ID int not null, 
    Name nvarchar(10) not null, 
    ParentID int null 
) 
declare @Customer table (
    ID int not null, 
    Name nvarchar(10) not null, 
    SurName nvarchar(10) not null, 
    Address nvarchar(30) not null, 
    CategoryId int not null 
) 
insert into @Catergory (ID, Name, ParentID) 
values (1, 'A', null), (2, 'B', null), 
    (3, 'C', null), (4, 'AA', 1), 
    (5, 'CC', 3), (6, 'AAA', 4), 
    (7, 'BB', 2), (8, 'AAA', 4), 
    (9, 'CCC', 5), (10, 'AA', 1) 

insert into @Customer (ID, Name, SurName, Address, CategoryId) 
values (1, 'Duck', 'Duffy', '10 Steet', 10), 
(2, 'Ben', 'Ten', '10 Steet', 6), 
(3, 'Cat', 'Dog', '10 Steet', 5), 
(4, 'Chicken', 'Wings', '10 Steet', 1), 
(5, 'Fish', 'Water', '10 Steet', 7) 

-- build structure using assumption that the depth is max three levels 

select * 
from @Customer cust 
    join (
     select ID, Name as CategoryName, null As CategoryType, null as SubCategory from @Catergory roots where ParentID is null 
     union 
     select mids.ID, roots.Name, mids.Name, null from @Catergory mids 
      join @Catergory roots on mids.ParentID = roots.ID and roots.ParentID is null 
     union 
     select leafs.ID, roots.Name, mids.Name, leafs.Name from @Catergory leafs 
      join @Catergory mids on leafs.ParentID = mids.ID 
      join @Catergory roots on mids.ParentID = roots.ID and roots.ParentID is null 
    ) as struct on cust.CategoryId = struct.ID 
order by cust.id 

Выход:

+----+---------+---------+----------+------------+----+--------------+--------------+-------------+ 
| ID | Name | SurName | Address | CategoryId | ID | CategoryName | CategoryType | SubCategory | 
+----+---------+---------+----------+------------+----+--------------+--------------+-------------+ 
| 1 | Duck | Duffy | 10 Steet |   10 | 10 | A   | AA   | NULL  | 
| 2 | Ben  | Ten  | 10 Steet |   6 | 6 | A   | AA   | AAA   | 
| 3 | Cat  | Dog  | 10 Steet |   5 | 5 | C   | CC   | NULL  | 
| 4 | Chicken | Wings | 10 Steet |   1 | 1 | A   | NULL   | NULL  | 
| 5 | Fish | Water | 10 Steet |   7 | 7 | B   | BB   | NULL  | 
+----+---------+---------+----------+------------+----+--------------+--------------+-------------+ 

Некоторые дополнительные колонны все еще там, но я вы можете избавиться от них. Обратите внимание, что некоторые столбцы картофеля имеют значения null. Это связано с тем, что, если клиент находится в верхней или средней категории, нет разумного способа заполнить эти столбцы.

+0

Большое вам спасибо, я пытался архивировать это в течение нескольких дней. ты звезда. Он работает отлично. – Tooleh