SQL Query Inner Присоединиться к заявлению?
Просто добавлен пример SQLFiddle с комментариями: http://sqlfiddle.com/#!3/d1cce
Я пытаюсь архивировать, чтобы получить большинство основных категорий в запросе (где Category.CategoryId = NULL
)
ПУНКТ НАЗВАНИЯ:
- 1 | НАЗВАНИЕ | 2
- 1 | TITLE2 | 3
ТАБЛИЦА КАТЕГОРИИ:
- 1 | Пример основной категории | НОЛЬ
- 2 | Пример подкатегории | 1
- 3 | Пример SubSubcategory | 2
РЕЗУЛЬТАТ ДОЛЖЕН БЫТЬ:
- 1 | НАЗВАНИЕ | Пример основной категории
- 2 | TITLE2 | Пример основной категории
Подобно:
select item.id, item.title (MAIN category where CategoryId = NULL) from .....
Итак, как вы можете видеть, я могу установить Item.CategoryId
в категорию, являющуюся категорией SUBSUB или SUB.
Но каждый раз, когда я хочу получить основную категорию в результате моего запроса
Как я могу это достичь?
И снова пример привел к тому, что я стал более ясным:
- 1-Item 1-Main 2
Таблицы:
create table Item ( Id INT IDENTITY(1,1) NOT NULL, CategoryId INT NOT NULL, Title VARCHAR(80) NOT NULL, PRIMARY KEY (id) ) insert into Itemvalues('Item 1', 5) create table Category ( Id INT IDENTITY(1,1) NOT NULL, Title VARCHAR(10) NOT NULL, CategoryId INT, PRIMARY KEY (id) ) insert into Category values('Main item 1', NULL) insert into Category values('Sub item under Main item 1', 1) insert into Category values('Main 2', NULL) insert into Category values(Sub item under 2', 2) insert into Category values('Subsub item under subitem 2', 4)
Это хорошая работа для общих табличных выражений, которые хорошо подходят для иерархических структур данных.
;with cte as ( select Id as ItemId, Title as ItemTitle, CategoryId, 0 as Level from Item union all select cte.ItemId, cte.ItemTitle, c.CategoryId, cte.Level + 1 as Level from Category c inner join cte on c.Id = cte.CategoryId and c.CategoryId is not null ) select ItemId, ItemTitle, c.Title as CategoryTitle from cte inner join Category c on c.Id = cte.CategoryId where Level = (select Max(Level) from cte as cte1 where cte1.ItemId = cte.ItemId)
Демо-версия SQL Fiddle