Эмуляция иерархии на SQL
От: naf2000  
Дата: 29.07.09 06:48
Оценка:
есть табличка справочника, типа есть группы в них группы или товары (как файлы-папки):
CREATE TABLE GOOD ( --товары
      ID Integer NOT NULL, --первичный ключ
      LEFTBOUND Integer NOT NULL,
      RIGHTBOUND Integer NOT NULL,
      PARENT Integer,--сылка на группу владельца, для первого уровня NULL
      NAME Varchar(50) NOT NULL, --наименование группы или товара
      ISGROUP Integer NOT NULL --признак группы: 0,1
);

правило: если товар А лежит в группе Б а та в группе С то:
C.LEFTBOUND<B.LEFTBOUND<A.LEFTBOUND=A.RIGHTBOUND<=B.RIGHTBOUND<=C.RIGHTBOUND

то есть диапозон LEFTBOUND ... RIGHTBOUND групп охватывает вложенные записи (групп и товаров)
для товаров (не групп) верно: LEFTBOUND=RIGHTBOUND

требуется написать запрос, упорядочивающий записи по иерархии, а среди записей одной ветки иерархии должно быть упорядочивание по (IsGroup,Name), например:

Группа 1
__Группа 1.1
____Товар 1.1.1
____Товар 1.1.2
__Товар 1.2
__Товар 1.3
Группа 2
__Группа 2.1
__Группа 2.2

вот такой запрос, дает иерархию, но не дает упорядоченности внутри веток иерархии:
SELECT g.ID, g.Name, g.ISGROUP, count(g2.ID) AS glevel
FROM GOOD g
LEFT JOIN GOOD g2 ON (g.LEFTBOUND BETWEEN g2.LEFTBOUND AND g2.RIGHTBOUND)
GROUP BY g.ID, g.Name, g.ISGROUP, g.LEFTBOUND
ORDER BY g.LEFTBOUND

поле glevel отвечает за уровень вложенности записи
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.