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

Только только стал использовать MSSQL2008.

Существует 2 таблицы вида:

CREATE TABLE [IM_Folders](
  [Key]			INT IDENTITY(1, 1) PRIMARY KEY,
  [Parent]		INT NOT NULL,
  [Name]		NVARCHAR(50) NOT NULL UNIQUE
)
GO


CREATE TABLE [IM_Files](
  [Key]			INT IDENTITY(1, 1) PRIMARY KEY,
  [FolderKey]	INT NOT NULL FOREIGN KEY REFERENCES [IM_Folders]([Key])
				ON DELETE CASCADE,
  [Name]		NVARCHAR(128) NOT NULL UNIQUE
)
GO


Нужно составить запрос, чтоб получился путь вида:
Папка\Папка2\Файл1
Папка\Папка10\Файл10
Папка\Папка10\Файл11
Папка\Файл2
Папка\Файл3

уже голову сломал... вроде есть способ через cte, но применить не могу понять как.
Если нет файла, то путь не должен строиться, т.е. составление пути идёт от файла
Люди добрые))) помогите составить запрос
17 окт 14, 10:44    [16718644]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Glory
Member

Откуда:
Сообщений: 104760
https://www.sql.ru/forum/316343/sql2005-populyarnye-zadachi-foruma-i-cte задачи 4 и 5
17 окт 14, 10:57    [16718735]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Tree10
Guest
Glory
https://www.sql.ru/forum/316343/sql2005-populyarnye-zadachi-foruma-i-cte задачи 4 и 5


Спасибо,
попробовал... выводит не те данные...

вот что получилось:

WITH Q(I, [Parent], [Name]) AS
(
 SELECT [Key], [Parent], CAST([Name] AS VARCHAR(200)) FROM (SELECT ROW_NUMBER() OVER(PARTITION BY [Parent] ORDER BY [Key])[Key], [Parent], [Name] FROM [IM_Folders]) [IM_Folders] WHERE [Key] = 1
 UNION ALL
 SELECT Q.I + 1, Q.[Parent], CAST(Q.[Name] + '\' + [IM_Folders].[Name] AS VARCHAR(200))
 FROM Q JOIN (SELECT ROW_NUMBER() OVER(PARTITION BY [Parent] ORDER BY [Key])[Key], [Parent], [Name] FROM [IM_Folders]) [IM_Folders] ON Q.[Parent] = [IM_Folders].[Parent] AND Q.I = [IM_Folders].[Key] - 1
)
SELECT [Parent], [Name] FROM Q WHERE I IN (SELECT MAX(QQ.I) FROM Q QQ WHERE QQ.[Parent] = Q.[Parent])
ORDER BY [Parent], I
OPTION (MAXRECURSION 0);
GO
17 окт 14, 12:03    [16719435]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Tree10
попробовал... выводит не те данные...

Поверить вам наслово ? Или ждать скрипта с "не теми данными" ?
17 окт 14, 12:04    [16719444]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Tree10
Guest
Glory,

скрипт

CREATE TABLE [IM_Folders](
  [Key]			INT IDENTITY(1, 1) PRIMARY KEY,
  [Parent]		INT NOT NULL,
  [Name]		NVARCHAR(50) NOT NULL UNIQUE
)
GO

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (0, 'Root')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (1, 'Папка1')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (1, 'Папка2')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (2, 'Папка3')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (1, 'Папка4')


Должно получится (но не получается((()
Root\Папка1
Root\Папка2
Root\Папка1\Папка3
Root\Папка4
17 окт 14, 12:23    [16719662]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Tree10,
А как у вас свянно Root со всеми сотальными то ? Где сообственно сам номер узла ?
17 окт 14, 12:30    [16719747]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Tree10
Guest
Maxx
Tree10,
А как у вас свянно Root со всеми сотальными то ? Где сообственно сам номер узла ?


Подразумевается, что при создании первой записи идентификатор будет "1"
17 окт 14, 12:37    [16719824]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Tree10
Guest
Tree10,

Всё получилось вопрос снят!
Всем кто пытался помочь спасибо!
17 окт 14, 12:51    [16719952]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
soljo_ua
Member

Откуда: Киев
Сообщений: 369
Tree10
Glory,

скрипт

CREATE TABLE [IM_Folders](
  [Key]			INT IDENTITY(1, 1) PRIMARY KEY,
  [Parent]		INT NOT NULL,
  [Name]		NVARCHAR(50) NOT NULL UNIQUE
)
GO

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (0, 'Root')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (1, 'Папка1')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (1, 'Папка2')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (2, 'Папка3')

INSERT INTO [IM_Folders]
  ([Parent], [Name])
VALUES
  (1, 'Папка4')


Должно получится (но не получается((()
Root\Папка1
Root\Папка2
Root\Папка1\Папка3
Root\Папка4


а покажите мне в Ваших данных дерево ))
17 окт 14, 12:51    [16719955]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Tree10
Guest
soljo_ua,

вообще-то старинный дедовский способ реализации древовидной структуры! что Вам нужно показать?!
но сейчас появилось нечто))) hierarchyid
17 окт 14, 13:00    [16720067]     Ответить | Цитировать Сообщить модератору
 Re: Древовидная структура. Как SQL запросом вытащить путь?  [new]
Алексей Куренков
Member [заблокирован]

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

когда то не лень было писать..
17 окт 14, 13:54    [16720682]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить