Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Еще раз о деревьях (вложенные множества)
|
|||
|---|---|---|---|
|
#18+
Начитался я статей по поводу представления иерархических структур в SQL. Попробовал использовать метод вложенных множеств как рекомендуют, вроде все класно, только что-то не пойму как состряпать такой простой запрос: Есть у меня таблица (ID int, Lft int, Rgt int), нужно получить для каждого ID его непосредственного bossa (ParentID). Кто-нибудь может подсказать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2002, 08:59 |
|
||
|
Еще раз о деревьях (вложенные множества)
|
|||
|---|---|---|---|
|
#18+
немного непонятно в вопросе: Lft значит Left, Rgt значит Right, видимо? И кто из них куда смотрит? Если Left смотрит на родителя, то Right куда? На детей? Тогда он явно лишний просто в этой ситуации. Я буквально позавчера читал MSDN, там есть две конкретные статьи (видимо, MS тоже достали такими вопросами ). Статьи называются как то так Extending Hierarhies и Extending Networks. Могу ошибиться - не Extending, а Expanding, скорее всего. Но именно два слова. Там конкретные реализации обоих алгоритмов - когда иерархия, то значит, что элемент может быть только наследником от одного родителя. Networks - это когда бардак , когда элемент может быть наследником любого количества "отцов". Там все разжевано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2002, 09:43 |
|
||
|
Еще раз о деревьях (вложенные множества)
|
|||
|---|---|---|---|
|
#18+
Пример из статьи http://www.sdm.viptop.ru/articles/sqltrees.html Список ВСЕХ боссов для выбранного ID SELECT @ID, B1.ID, (B1.Rgt - B1.Lft) AS height FROM Personnel B1, Personnel E1 WHERE E1.Lft BETWEEN B1.Lft AND B1.Rgt AND E1.Rgt BETWEEN B1.Lft AND B1.Rgt AND E1.ID = @ID Непосредственным боссом будет тот, у которого значение height - наименьшее. Ну или наибольшее значение Lft или наименьшее значение Rgt. Поскольку значения Lft и Rgt также уникальны как и ID, то можно определить непосредственного босса так: SELECT MAX(B1.Lft) AS BossLft FROM Personnel B1, Personnel E1 WHERE E1.Lft BETWEEN B1.Lft AND B1.Rgt AND E1.Rgt BETWEEN B1.Lft AND B1.Rgt AND E1.ID = @ID Ну, и по значению BossLft однозначно определить ID непосредственного босса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2002, 10:35 |
|
||
|
Еще раз о деревьях (вложенные множества)
|
|||
|---|---|---|---|
|
#18+
CREATE TABLE Employees (empid int NOT NULL, mgrid int NULL, empname varchar(25) NOT NULL, salary money NOT NULL, lvl int NULL, hierarchy varchar(900) NULL, CONSTRAINT PK_Employees_empid PRIMARY KEY(empid), CONSTRAINT FK_Employees_mgrid_empid FOREIGN KEY(mgrid) REFERENCES Employees(empid)) GO для каждого employee ID - его непосредственного bossa : SELECT E.empname AS EmployeeName, M.empname AS ManagerName FROM Employees AS E LEFT OUTER JOIN Employees AS M ON E.mgrid = M.empid http://www.osp.ru/win2000/sql/967.htm ochen" xoroshaia stat"ia (" Иерархические структуры, не требующие сопровождения ") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2002, 16:02 |
|
||
|
Еще раз о деревьях (вложенные множества)
|
|||
|---|---|---|---|
|
#18+
То ВладимирМ: Ваш пример не работает (BossLft получается = Lft для @ID). Пример из статьи я смотрел, все получается как надо. Просто у меня не получается доработать данный пример так, что бы получить ближайшего bossa для каждого ID таблицы, а не для конкретного @ID т.е. из таблицы вложенных множеств ID LFT RGT ----------------- 1 1 10 2 2 5 3 3 4 4 6 9 5 7 8 получить таблицу смежных вершин графа ID ParentID ------------------ 1 NULL 2 1 3 2 4 1 5 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2002, 09:39 |
|
||
|
Еще раз о деревьях (вложенные множества)
|
|||
|---|---|---|---|
|
#18+
\nSelect step1.ID As ID, step2.ID As Parent From ( SELECT EH1.ID,MAX(EH2.Lft) As lft FROM Hierarchy AS EH1 LEFT join Hierarchy AS EH2 on EH1.lft > EH2.lft AND EH1.lft < EH2.rgt Group By EH1.ID ) step1 left join Hierarchy step2 on step2.Lft=step1.lft ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2002, 07:32 |
|
||
|
|

start [/forum/topic.php?fid=46&tid=1822956]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 482ms |

| 0 / 0 |
