| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> comp.databases.theory -> Re: Nested sort, trying again
mAsterdam wrote:
> Bob Stearns wrote:
>
>> I have a table (see below for ddl) which implements a set of locations >> for an organization, from the whole organization to shelves in a >> particular room. Users never see the primary key, only the NAMEX,
>> usually as a drop down selection list, sometimes a single selection >> other times a multiselection. Users, being users, want the ability to >> change names and to see the names in sorted order at each level.
>> If I didn't have to have changeable names, I could define the data in >> alphabetic order.
>> Given that I can't do that,
>> is there (relatively) easy >> way to present the data in a sorted manner?
>> This is the same as seeing you directory tree in Windows explorer with >> the name chosen as the sort key. The root directory is sorted in >> filename order, then every directory under in it also in name order, >> down an arbitrary number of levels. In my examples, users attach >> people, functions, things etc. to locations at any level, can add >> additional locations at any level (dividing up a room, adding >> shelving, buying a new building, etc.). Because history is important, >> locations can only become inactive, never deleted.
>> Because of the arbitrary number of levels,
>> I can not join any other table to achieve the sort I want. >> >> CREATE TABLE IS3.LOCATIONS ( >> LOC_ID INTEGER GENERATED BY DEFAULT AS IDENTITY >> (START WITH 1, INCREMENT BY 1, CACHE 20) NOT NULL, >> NAMEX VARCHAR(30) NOT NULL, >> LEFTX INTEGER NOT NULL, >> RIGHTX INTEGER NOT NULL, >> ENTITY_ID INTEGER NOT NULL, >> INACTIVE CHARACTER(25),
>> PRIMARY KEY(LOC_ID)
>> )
>> GO
>> ALTER TABLE IS3.LOCATIONS
>> ADD CONSTRAINT INACTIVE
>> CHECK (INACTIVE in ('Y','N'))
>> GO
>> ALTER TABLE IS3.LOCATIONS
>> ADD CONSTRAINT SQL040717191150980
>> FOREIGN KEY(ENTITY_ID)
>> REFERENCES IS3.ENTITIES_PUB(ENTITY_ID)
>> ON DELETE NO ACTION
>> ON UPDATE NO ACTION
>> GO
I thought everyone on here would be familiar with Joe Celko's Nested Set representation of a tree; he has an entire book devoted to it: _Trees and Hierarchies in SQL for Smarties_; ISBN 1-55860-920-2. It uses the left and right indices to represent containership. For instance the tree a(b(c,d),e(f(g,h))) (sorry for the linear representation, ASCII does not lend itself to drawing trees) would be represented by the rows:
a 1 16
b 2 7
c 3 4
d 5 6
e 8 15
f 9 14
g 10 11
h 12 13
A leaf node has left=right-1. Higher nodes have left < left of any child, right > right of any child. Lots of good properties for adding and searching, not too difficult changing, rather harder deletion.
In this case the tree is sorted in the order I want to present it to my users. Consider the tree z(y(x,w),v(y(t,s))) which would have a similar representation to the first on but which I wish to present to my users as:
z
v
u
s
t
y
w
x
![]() |
![]() |