Antecedentes
Esto es para la construcción de algunas vistas que usaremos para generar informes.
Tengo una tabla de ubicaciones, los campos clave son "ubicación" y "padre" .
La estructura que crean estos dos campos, en términos de nivel, está en la línea del Nombre de la empresa -> Nombre del campus -> Nombre del edificio -> Nombre del piso -> Nombre de la sala. El nombre de la empresa sigue siendo el mismo y el nombre del campus sigue siendo el mismo en este caso.
La estructura de ubicaciones generalmente se ve así:
+-----------+
| Org. Name |
+-----+-----+
|
+-----v-----+
+--------------------+|Campus Name|+---+--+-------------+
| +--+--------+ | |
| | | |
| | | |
+--+-----+ +------+-+ +--+----+ +---+---+
+--+| BLDG-01|+--+ | BLDG-02| |BLDG-03| |Grounds|
| +--------+ | +--------+ +-------+ +-------+
+-+------+ +-----+--+
|Floor-01| |Basement+-------+
+-+------+ +--------+ |
| |
| |
| +----------+ +-------+--+
+-+Room 1-001| |Room B-002|
+----------+ +----------+
Cada ubicación se vincula a su ubicación principal, que en última instancia es el nombre de la organización. Actualmente, solo hay una organización y un campus.
Metas
- Me gustaría poder consultar todas las ubicaciones debajo de cualquier ubicación dada en el nivel "Edificio". Esto es para que pueda devolver cosas como cuántos pedidos de trabajo se han realizado para cualquier ubicación dentro de un edificio determinado.
- Me gustaría poder determinar qué sububicación pertenece a qué edificio . Esencialmente lo contrario; Me gustaría ir desde cualquier nivel por debajo del nivel del edificio y rastrear hasta donde está el edificio.
- Me gustaría que esto sea en una vista . Eso significa que me gustaría tener una tabla que para cada elemento en el nivel de "edificio", enumere el edificio en la columna de la izquierda y todas las ubicaciones posibles BAJO ese edificio en la columna de la derecha. De esta manera, tendría una lista que podría consultar en cualquier momento para encontrar qué ubicaciones forman parte de cada edificio.
Intentos y hacerlo bien
Intenté hacer esto a través de vistas horriblemente construidas, consultas de UNION, etc., que me han parecido una mala idea. Sé que Oracle posee un mecanismo para esto a través de "CONECTAR POR"; No estoy seguro de cómo usarlo.
NULL
para ellos? ¿Cómo identificas un "nivel de construcción"?Respuestas:
FrusteratedWithFormsDesigner tiene la dirección correcta (+1). Esto es lo que creo que estás buscando específicamente.
La vista logra los tres objetivos. Puede consultar un edificio para encontrar todo lo que contiene y puede consultar una sububicación para encontrar en qué edificio se encuentra.
Si no desea contar el edificio en sí como una de las ubicaciones secundarias, puede ajustar la consulta existente en una que elimine las entradas en las que el edificio y la sububicación son iguales.
fuente
CONNECT BY
es la forma correcta de manejar datos que son naturalmente recursivos.No sé cómo se ve tu mesa, pero tal vez algo así como:
Esto debería obtener nodos en "BLDG-01".
La
START WITH
cláusula es su caso base.Otra explicación (aparte de la de Oracle, que supongo que ya has leído y con la que has tenido problemas, probablemente sea muy breve):
http://www.adp-gmbh.ch/ora/sql/connect_by.html
También:
http://psoug.org/reference/connectby.html
Y:
http://www.oradev.com/connect_by.jsp
fuente
No estoy seguro de entender tu pregunta por completo, pero tal vez algo como esto:
Esto le mostrará la jerarquía de cada ubicación.
fuente