Subject Recursive query
Author

Hi,


I have a table with the following DDL:


CREATE TABLE LOCALITY (

    ID               INTEGER NOT NULL,

    PARENT_ID        INTEGER,

    CT_NODETYPES_ID  INTEGER,

    DESCRIPTION      VARCHAR(30),

);


The foreign key:  CT_NODETYPES_ID refers to a table CT_NODETYPES with the following potential values:

ID DESCRIPTION
1 Country
2 Province
3 Farm registration districts
4 District Municipality
5 Metropolitan Municipality
6 Local Municipality

Typical data for LOCALITY are:

ID PARENT_ID CT_NODETYPES_ID DESCRIPTION
1 1 South Africa
2 1 2 CONTINENTAL SHELF SOUTH AFRICA
3 1 2 EASTERN CAPE
4 1 2 FREE STATE
5 1 2 GAUTENG
6 1 2 KWAZULU-NATAL
7 1 2 LIMPOPO
8 1 2 MPUMALANGA
9 1 2 NORTH WEST
10 1 2 NORTHERN CAPE
11 1 2 WESTERN CAPE
128 10 3 BARKLY WEST
129 10 3 BRITSTOWN
130 10 3 CALVINIA
146 11 3 BEAUFORT WEST
147 11 3 BELLVILLE
148 11 3 BREDASDORP
178 9 4 Bojanala
179 7 4 Capricorn
180 9 4 Central
181 9 4 Bophirima
182 5 5 Ekurhuleni
183 5 5 Johannesburg
184 5 6 Mogale
185 7 4 Mopani
186 7 4 Sekhukhune
187 7 4 Vhembe
188 7 4 Waterberg
189 9 4 Southern
190 5 5 Tshwane


I then typically use (as a foreign key) a record from LOCALITY at the lowest level, e.g. ID = 148 as the locality (farm registration district) of an abandoned mine or ID = 184 as the locality (Local municipality) of a unsafe mine opening.

When I display the data in a grid of a web application or in a column of a report, I also want to display the province (ID = 2 in table CT_NODETYPES)

I also want to generate stats from the mine table, e.g.

Select Province_Name, Mine_Name, Count(ID) as Total from V_MINES
where Province_ID = 4
Group by Province_Name, Mine_Name

V_MINES is a view spanning several tables.

The problem I have is that (in the MINES table) I do not store the ID of the provinces but I store the ID of the farm registration districts (a child node of the province node).

In the table for unsafe mine openings, I store the ID of local, metropolitan or district municipality.

My use, and knowledge, of recursive common table expressions (CTE) is limited to iterate downwards from a node in a tree-structure (used as foreign key in a table).

Now what I'm actually want is to look up the parent at a certain level (or classified as a certain type) of a "lower" record (node) in a tree-structure.

Surely there must be a way to solve this problem?


Regards,

Nols Smit

(Council for Geoscience, South Africa)