Несколько часов назад я задал этот вопрос об иерархии двух таблиц.< /а>
Я сделал новый пост для своего следующего вопроса, так как на мой первоначальный ответ был дан правильный и быстрый. Однако меня попросили не полагаться на другой вопрос, поэтому вот сценарий:
У меня есть следующие таблицы:
create table areas
(
id NUMBER not null,
name VARCHAR2(200) not null,
parent_id NUMBER
);
-- Top Level
Insert into areas (id, name)
Values (1, 'Europe');
Insert into areas (id, name)
Values (2, 'Americas');
Insert into areas (id, name)
Values (3, 'Asia ex Japan');
Insert into areas (id, name)
Values (4, 'Japan');
-- Jurisdictions
Insert into areas (id, name, parent_id)
Values (5, 'UK', 1);
Insert into areas (id, name, parent_id)
Values (7, 'France', 1);
Insert into areas (id, name, parent_id)
Values (6, 'Germany', 1);
Insert into areas (id, name, parent_id)
Values (8, 'Italy', 1);
Insert into areas (id, name, parent_id)
Values (9, 'US', 2);
Insert into areas (id, name, parent_id)
Values (10, 'Australia', 3);
Insert into areas (id, name, parent_id)
Values (11, 'New Zealand', 3);
create table places
(
id NUMBER not null,
name VARCHAR2(200) not null,
area_id NUMBER,
parent_id NUMBER,
no_of_pubs NUMBER
);
Insert into places (id, name, area_id, parent_id)
Values (1, 'London', 5, NULL, 50);
Insert into places (id, name, area_id, parent_id)
Values (2, 'Bath', 5, NULL, 20);
Insert into places (id, name, area_id, parent_id)
Values (3, 'Liverpool', 5, NULL, 32);
Insert into places (id, name, area_id, parent_id)
Values (4, 'Paris', 7, NULL, 64);
Insert into places (id, name, area_id, parent_id)
Values (5, 'New York', 9, NULL, 76);
Insert into places (id, name, area_id, parent_id)
Values (6, 'Chicago', 9, NULL, 5);
Insert into places (id, name, area_id, parent_id)
Values (7, 'Kings Cross', 5, 1, 6);
Insert into places (id, name, area_id, parent_id)
Values (8, 'Tower of London', 5, 1, 0);
И следующий код для представления данных:
with src as (
select 'A' type, a.id, a.name, a.parent_id, null area_id from areas a
union all
select 'P', -p.id id, p.name, -p.parent_id parent_id, area_id from places p)
select
src.*, level
from
src
start with
type = 'A' and parent_id is null
connect by
parent_id = prior id or
parent_id is null and area_id = prior id
Со времени последнего поста я изменил таблицу мест, так что каждое «место» теперь имеет столбец «number_of_pubs», как лучше всего рассчитать это в иерархии?
Например, в Великобритании будет 108 пабов, в Лондоне — 56, а на Кингс-Кросс — 6.
Надеюсь, это объясняет, чего я пытаюсь достичь.
Моя текущая идея состоит в том, чтобы передать «тип» и «идентификатор» функции, которая затем обрабатывает результат, перебирая дочерние записи и добавляя пабы.
Прежде чем я начну, есть ли более приятный способ или я на правильном пути?
Изменить: поскольку я опубликовал это, у меня действительно есть функция для работы, но мне было бы интересно посмотреть, возможно ли это с использованием только SQL. Если это не так, я опубликую свое решение, но мне придется его переработать, поскольку мои данные не совпадают с моим примером.
Спасибо еще раз.