tło
Jest to konstrukcja niektórych widoków, których będziemy używać do raportowania.
Mam tabelę lokalizacji, a kluczowymi polami są „lokalizacja” i „rodzic” .
Struktura, którą te dwa pola tworzą, pod względem poziomu, jest zgodna z nazwą firmy -> nazwa kampusu -> nazwa budynku -> nazwa piętra -> nazwa pokoju. Nazwa firmy pozostaje taka sama, a nazwa kampusu pozostaje taka sama w tym przypadku.
Struktura lokalizacji ogólnie wygląda następująco:
+-----------+
| Org. Name |
+-----+-----+
|
+-----v-----+
+--------------------+|Campus Name|+---+--+-------------+
| +--+--------+ | |
| | | |
| | | |
+--+-----+ +------+-+ +--+----+ +---+---+
+--+| BLDG-01|+--+ | BLDG-02| |BLDG-03| |Grounds|
| +--------+ | +--------+ +-------+ +-------+
+-+------+ +-----+--+
|Floor-01| |Basement+-------+
+-+------+ +--------+ |
| |
| |
| +----------+ +-------+--+
+-+Room 1-001| |Room B-002|
+----------+ +----------+
Każda lokalizacja prowadzi z powrotem do swojej lokalizacji nadrzędnej, która ostatecznie jest nazwą organizacji. Obecnie istnieje tylko jedna organizacja i jeden kampus.
Cele
- Chciałbym móc sprawdzać wszystkie lokalizacje poniżej dowolnej lokalizacji na poziomie „Budynku”. Dzięki temu mogę zwrócić rzeczy, takie jak liczbę zleceń wykonanych dla dowolnej lokalizacji w danym budynku.
- Chciałbym być w stanie określić, która podstacja należy do którego budynku . Zasadniczo odwrotnie; Chciałbym przejść z dowolnego poziomu poniżej poziomu budynku i prześledzić z powrotem do tego, czym jest budynek.
- Chciałbym, żeby to było w zasięgu wzroku . Oznacza to, że chciałbym mieć tabelę, która dla każdego elementu na poziomie „budynku” zawiera listę budynku w lewej kolumnie i wszystkie możliwe lokalizacje POD tym budynkiem w prawej kolumnie. W ten sposób miałbym listę, którą mogłem w dowolnym momencie przeszukać, aby ustalić, które lokalizacje są częścią danego budynku.
Próby i robienie tego dobrze
Próbowałem to zrobić poprzez okropnie skonstruowane widoki, zapytania UNION itp. - które wydawały się złym pomysłem. Wiem, że Oracle posiada do tego mechanizm poprzez „CONNECT BY”; Po prostu nie jestem pewien, jak to wykorzystać.
NULL
dla nich rodzicem ? Jak rozpoznać „poziom budynku”?Odpowiedzi:
FrusteratedWithFormsDesigner ma właściwy kierunek (+1). Oto, jak myślę, czego konkretnie szukasz.
Widok osiąga wszystkie trzy cele. Możesz zapytać go o budynek, aby znaleźć wszystko, co zawiera, i możesz zapytać go o pod-lokalizację, aby znaleźć budynek.
Jeśli nie chcesz liczyć samego budynku jako jednej z pod-lokalizacji, możesz zawinąć istniejące zapytanie w jedną, eliminując wpisy, w których budynek i sublokacja są takie same.
źródło
CONNECT BY
to właściwy sposób obsługi danych, które są naturalnie rekurencyjne.Nie wiem, jak wygląda twój stół, ale może coś takiego:
To powinno uzyskać węzły pod „BLDG-01”.
START WITH
Klauzula jest baza sprawa.Kolejne wyjaśnienie (oprócz Oracle, które, jak zakładam, już przeczytałeś i miałeś problem, to prawdopodobnie bardzo zwięzłe):
http://www.adp-gmbh.ch/ora/sql/connect_by.html
Również:
http://psoug.org/reference/connectby.html
I:
http://www.oradev.com/connect_by.jsp
źródło
Nie jestem pewien, czy rozumiem całkowicie twoje pytanie, ale może coś takiego:
Spowoduje to wyświetlenie hierarchii dla każdej lokalizacji
źródło