Моё меню Общее меню Сообщество Правила форума Все прочитано
Вернуться   uForum.uz > ИКТ и телеком > IT-индустрия > ЦППМП
Сообщения за день Поиск
Знаете ли Вы, что ...
...до того как открыть новую тему, стоит использовать поиск: такая тема уже может существовать.
<< Предыдущий совет - Случайный совет - Следующий совет >>

ЦППМП Центр подготовки и поддержки молодых программистов (cppmp.uz). Еще разделы на форуме: Doppix


Ответить

 
Опции темы Опции просмотра
Старый 28.04.2009 12:33   #1  
Pre Open ID Group
Аватар для Khamza Davletov
Оффлайн
Сообщений: 30
+ 34  6/3
– 0  0/0

UzbekistanОтправить сообщение для Khamza Davletov с помощью ICQОтправить сообщение для Khamza Davletov с помощью YahooОтправить сообщение для Khamza Davletov с помощью Skype™
Как это можно написать в виде запроса?

Скажем есть таблица, MenuItem

MenuItem
---------
Id int primary key
Name ntext
ParentId int (foreign key на саму себя)
Depth int (глубина вложенности)

в качестве входного параметра задается число :id. Надо вывести весь список имен (Name) записей по иерархии вверх для данного :id в качестве первичного ключа.


Например,
Цитата:
Id | Name | ParentId | Depth
1 | Test1 | NULL | 0
2 | Test21| 1 | 1|
3 | Test31 | 2 | 2
4 | Test22 | 1 | 1
Для 1, это будет "test1",
Для 3, это будет "Test31, Test21, Test1",
Для 4, "Test22, Test1".

Последний раз редактировалось Khamza Davletov; 28.04.2009 в 12:37.
Ответить 
Старый 28.04.2009 13:13   #2  
Real ID Group uParty Member VITUS
Аватар для Vitaliy Fioktistov
Оффлайн
FOM Group
руководитель отдела разработки ПО
AKA:Vitus
Сообщений: 3,976
+ 2,659  2,138/1,101
– 123  21/18

UzbekistanОтправить сообщение для Vitaliy Fioktistov с помощью ICQОтправить сообщение для Vitaliy Fioktistov с помощью Skype™LiveJournalМой мирFacebook
Иерархические (рекурсивные) запросы
__________________
Почему в конце денег остается еще так много месяца?
Ответить 
"+" от:
Старый 28.04.2009 13:13   #3  
Open ID Group uParty Member
Аватар для Timur Naimov
Оффлайн
Сообщений: 412
+ 62  206/121
– 0  0/0

UzbekistanОтправить сообщение для Timur Naimov с помощью ICQОтправить сообщение для Timur Naimov с помощью YahooОтправить сообщение для Timur Naimov с помощью Skype™
Цитата:
Сообщение от Khamza Davletov Посмотреть сообщение
Скажем есть таблица, MenuItem
В лоб - не пытался оптимизировать, возможно есть более рациональное решение

Код:
GO

DECLARE @temp TABLE
(
  Id INT NOT NULL
)

DECLARE @MenuItemId int, @CurrentParentId int, @CurrentId int

SET @MenuItemId = 3

SELECT @CurrentId = Id, @CurrentParentId = ParentId FROM MenuItems WHERE Id = @MenuItemId
INSERT INTO @temp VALUES(@CurrentId)

WHILE @CurrentParentId IS NOT NULL
BEGIN	
	SELECT @CurrentId = Id, @CurrentParentId = ParentId FROM MenuItems WHERE Id = @CurrentParentId
	INSERT INTO @temp VALUES(@CurrentId)
END
SELECT @CurrentId = Id FROM MenuItems WHERE Id = @CurrentParentId
INSERT INTO @temp VALUES(@CurrentId)

SELECT * FROM MenuItems WHERE Id IN (SELECT Id FROM @temp)

GO
Ответить 
"+" от:
Старый 28.04.2009 13:19   #4  
Аватар для Georgick
Оффлайн
Navitas
Team Leader
Сообщений: 1,026
+ 488  582/279
– 1  8/8

UzbekistanОтправить сообщение для Georgick с помощью ICQОтправить сообщение для Georgick с помощью Skype™LiveJournal
этот тип задач называется Nested Sets
погуглите, на эту тему много, что написано
Ответить 
"+" от:
Старый 29.04.2009 10:46   #5  
Аватар для Nestik
Оффлайн
ZOG
eminence grise
Сообщений: 2,258
+ 277  835/480
– 353  232/151

UzbekistanОтправить сообщение для Nestik с помощью ICQ
Цитата:
Сообщение от Khamza Davletov Посмотреть сообщение
Скажем есть таблица, MenuItem

MenuItem
---------
Id int primary key
Name ntext
ParentId int (foreign key на саму себя)
Depth int (глубина вложенности)

в качестве входного параметра задается число :id. Надо вывести весь список имен (Name) записей по иерархии вверх для данного :id в качестве первичного ключа.


Например,
Цитата:
Id | Name | ParentId | Depth
1 | Test1 | NULL | 0
2 | Test21| 1 | 1|
3 | Test31 | 2 | 2
4 | Test22 | 1 | 1
Для 1, это будет "test1",
Для 3, это будет "Test31, Test21, Test1",
Для 4, "Test22, Test1".
Если бд Oracle то

SELECT DECODE(level, 1, '', 2 , '- ', 3, '--', 4, '---')||name
FROM MenuItem
START WITH id = 1
CONNECT BY PRIOR id = parent_id

Последний раз редактировалось Nestik; 29.04.2009 в 10:48.
Ответить 
"+" от:
Старый 29.04.2009 11:12   #6  
Pre Open ID Group
Аватар для Khamza Davletov
Оффлайн
Сообщений: 30
+ 34  6/3
– 0  0/0

UzbekistanОтправить сообщение для Khamza Davletov с помощью ICQОтправить сообщение для Khamza Davletov с помощью YahooОтправить сообщение для Khamza Davletov с помощью Skype™
Цитата:
Сообщение от Nestik Посмотреть сообщение
Если бд Oracle то SELECT DECODE(level, 1, '', 2 , '- ', 3, '--', 4, '---')||name FROM MenuItem START WITH id = 1 CONNECT BY PRIOR id = parent_id
Неа, надо на T-SQL, ну то что comes with MS SQL Server.

Последний раз редактировалось Khamza Davletov; 29.04.2009 в 11:30.
Ответить 
Старый 29.04.2009 11:25   #7  
Аватар для stbd
Оффлайн
Сообщений: 134
+ 0  40/30
– 0  19/11

Uzbekistan
Цитата:
Сообщение от Nestik Посмотреть сообщение
SELECT DECODE(level, 1, '', 2 , '- ', 3, '--', 4, '---')||name
FROM MenuItem
START WITH id = 1
CONNECT BY PRIOR id = parent_id
а если level>4?

Цитата:
Сообщение от Khamza Davletov
Неа, надо на T-SQL, ну то что come with MS SQL Server.
в MS SQL, насколько помню, есть common table expressions (CTE), с их помощью делаются рекурсивные запросы

Последний раз редактировалось stbd; 29.04.2009 в 11:28.
Ответить 
"+" от:
Реклама и уведомления
Старый 29.04.2009 12:44   #8  
Аватар для Nestik
Оффлайн
ZOG
eminence grise
Сообщений: 2,258
+ 277  835/480
– 353  232/151

UzbekistanОтправить сообщение для Nestik с помощью ICQ
Цитата:
Сообщение от stbd Посмотреть сообщение
а если level>4?
Это просто для примера.
Ответить 
Ответить




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Advertisement System V2.5 By Branden
OOO «Единый интегратор UZINFOCOM»


Новые 24 часа Кто на форуме Новички Поиск Кабинет Все прочитано Вверх