Задний план
Это для построения некоторых представлений, которые мы будем использовать для отчетов.
У меня есть таблица местоположений, ключевые поля которых "местоположение" и "родитель" .
Структура, которую создают эти два поля, по уровням, соответствует названиям компании -> название кампуса -> название здания -> название этажа -> название комнаты. Название компании остается прежним, а название Campus в этом случае остается прежним.
Структура локаций обычно выглядит так:
+-----------+
| Org. Name |
+-----+-----+
|
+-----v-----+
+--------------------+|Campus Name|+---+--+-------------+
| +--+--------+ | |
| | | |
| | | |
+--+-----+ +------+-+ +--+----+ +---+---+
+--+| BLDG-01|+--+ | BLDG-02| |BLDG-03| |Grounds|
| +--------+ | +--------+ +-------+ +-------+
+-+------+ +-----+--+
|Floor-01| |Basement+-------+
+-+------+ +--------+ |
| |
| |
| +----------+ +-------+--+
+-+Room 1-001| |Room B-002|
+----------+ +----------+
Каждое местоположение ссылается на свое родительское местоположение, которое в конечном итоге является названием организации. В настоящее время существует только одна организация и один кампус.
цели
- Я хотел бы иметь возможность запрашивать все местоположения ниже любого данного местоположения на уровне "здания". Это так, что я могу вернуть такие вещи, как, сколько рабочих заказов было выполнено для любого места в данном здании.
- Я хотел бы иметь возможность определить, какое подразделение принадлежит какому зданию . По сути наоборот; Я хотел бы перейти с любого уровня ниже уровня здания и проследить, что это за здание.
- Я хотел бы, чтобы это было в поле зрения . Это означает, что я хотел бы иметь таблицу, в которой для каждого элемента на уровне «здания» перечислены здания в левом столбце и все возможные местоположения ниже этого здания в правом столбце. Таким образом, у меня был бы список, к которому я мог бы обратиться в любое время, чтобы найти, какие места являются частью какого здания.
Попытки и правильные поступки
Я пытался сделать это с помощью ужасно сконструированных представлений, запросов UNION и т. Д., Которые кажутся плохой идеей. Я знаю, что Oracle обладает механизмом для этого через «CONNECT BY»; Я просто не уверен, как это использовать.
NULL
для них? Как вы определяете «уровень здания»?Ответы:
FrusteratedWithFormsDesigner имеет правильное направление (+1). Вот то, что я думаю, вы ищете специально.
Представление выполняет все три цели. Вы можете запросить его для здания, чтобы найти все, что оно содержит, и вы можете запросить его для подобласти, чтобы найти, в каком здании оно находится.
Если вы не хотите считать само здание как одно из подразделов, вы можете заключить существующий запрос в один, удаляя записи, в которых здание и подраздел являются одинаковыми.
источник
CONNECT BY
это правильный способ обработки данных, которые являются естественно рекурсивными.Я не знаю, как выглядит ваш стол, но может быть что-то вроде:
Это должно получить узлы под "BLDG-01".
START WITH
Раздел Ваш базовый случай.Другое объяснение (кроме Oracle, которое, как я полагаю, вы уже прочитали и с которым возникли проблемы, возможно, очень кратко):
http://www.adp-gmbh.ch/ora/sql/connect_by.html
Также:
http://psoug.org/reference/connectby.html
И:
http://www.oradev.com/connect_by.jsp
источник
Я не уверен, что полностью понимаю ваш вопрос, но может быть что-то вроде этого:
Это покажет вам иерархию для каждого местоположения
источник