У меня есть таблица, которая содержит места, например, для тюрьмы.Выбор таблицы иерархии
CREATE TABLE [dbo].[Location](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NULL,
[LocationTypeID] [int] NOT NULL,
[GeoLocation] [geometry] NULL,
[Name] [varchar](50) NOT NULL,
[Description] [varchar](100) NOT NULL
CONSTRAINT [pk_location] PRIMARY KEY (ID)
)
Данные файл вставка здесь: data.sql file Когда ParentID имеет нулевое значение, это корневой узел системы.
В данных может быть тюрьма (TypeID = 5), здание (TypeID = 6), пол, ячейка и кровать. Идентификатор родителя - это местоположение, в котором находится текущее местоположение.
Я создал представление, обеспечивающее легкий доступ к этой таблице.
CREATE VIEW [dbo].[vwLocations]
AS
WITH MyLocation
AS (
SELECT ParentID,
ID,
Name,
0 AS LevelNo,
CAST(CAST(LocationTypeID AS VARCHAR) + '|' + Name AS VARCHAR(512)) AS SORT_PATH
FROM dbo.Location AS A
WHERE (ParentID IS NULL)
UNION ALL
SELECT C.ParentID,
C.ID,
C.Name,
MyLocation_1.LevelNo + 1 AS Expr1,
CAST(MyLocation_1.SORT_PATH + '//' + CAST(C.LocationTypeID AS VARCHAR) + '|' + C.Name AS VARCHAR(512)) AS SORT_PATH
FROM dbo.Location AS C
INNER JOIN MyLocation AS MyLocation_1
ON MyLocation_1.ID = C.ParentID
)
SELECT ISNULL(ID, -999) AS LocationID,
ParentID,
LevelNo AS LevelNumber,
SORT_PATH AS FullPath,
Name AS Description
FROM MyLocation AS ML
GO
И это хорошо работает и эффективно для всех случаев. Разработчик возвращает строку, если хочет разбить ее на каждый компонент. Например, я возвращаю строку:
5 | Тюрьма // 6 | P 1 // 7 | P 1 // 8 | 1 // 9 | 01 // 10 | 01
Что они тогда раскол на '//', чтобы получить
5 | Тюремные 6 | P 1 7 | P 1 8 | 1 9 | 01 10 | 01
Это означает, ID 5 означает его тюрьма, ID 6 означает, что это здание, ID 7 - это раздел, ID 8 - пол, 9 - ячейка, а 10 - кровать.
Они делают это в коде.
Проблема в том, что они хотят иметь возможность сортировать по полу, например. Который, я не могу. Что-то мне нужно сделать, это добавить дополнительные столбцы для каждой строки, называемые «Тюрьма», «Строительство» ... и т. Д., И заполнить их.
Таким образом, некоторые из них могут быть пустыми, потому что, если это место, например, этаж, то столбцы Тюрьма, Строительство, раздел и пол будут иметь данные, а остальные будут пустыми.
Возможно ли это?
Вы пробовали подстроить поле в отдельные поля, сохранив это как представление, а затем отсортировав новый столбец в представлении? – JLB
@JLB - Я собирался попробовать это, но может ли это быть сделано в представлении? Будет ли это заявление «CASE»? Но даже если бы это было так, я не знаю, как я могу использовать оператор CASE, чтобы заполнить разные столбцы. Или CASE будет в окончательном выборе, и может быть 5 операторов CASES - по одному для каждого столбца? Или вы говорите два вида, это один из них - первичное извлечение данных, а затем некоторая сортировка во втором представлении - как-то? – Craig
Если я правильно читаю запрос, вы запрашиваете поиск по ширине (BFS) вашей иерархии. Если да, укажите некоторые примеры данных (желательно в формате, в котором я могу скопировать/вставить его в SSMS и извлечь из него таблицу), и я могу предоставить код, который даст вам упорядоченный набор результатов BFS. –