Aqui está minha estrutura de dados:
CREATE TABLE Locations(
LocID int IDENTITY(1,1) NOT NULL,
LocationTypeID int NOT NULL,
ParentID int NULL,
LocNum varchar(50) NULL,
LocName varchar(250) NULL,
)
CREATE TABLE LocationTypes(
LocationTypeID int IDENTITY(1,1) NOT NULL,
TypeName varchar(50) NOT NULL
)
A tabela LocationTypes contém os seguintes valores:
+----------------+----------+
| LocationTypeID | TypeName |
+----------------+----------+
| 1 | Campus |
| 2 | Building |
| 3 | Area |
| 4 | Floor |
| 5 | Room |
+----------------+----------+
A Locations
tabela contém vários locais, alguns em que o ParentID
é nulo (Campus) e outros que têm um ParentID
. Existem 5 níveis de hierarquia para minha estrutura de dados, indicados na LocationTypes
tabela. Campus (1) sendo o menos específico, e Room(5) sendo o mais específico. No meu banco de dados eu tenho outras tabelas que referenciam o LocID
, na maioria das vezes essas tabelas estão referenciando Locations com um LocationTypeID
of 5
, mas nem sempre.
Eu preciso obter os nomes de cada local na hierarquia para exibição ao usuário final.
Em última análise, o que eu quero obter é uma visão (ou tabela em cache) com a seguinte estrutura:
+-------+---------------+-----------------+-------------+--------------+-------------+
| LocID | CampusLocName | BuildingLocName | AreaLocName | FloorLocName | RoomLocName |
+-------+---------------+-----------------+-------------+--------------+-------------+
Percebo que algumas dessas colunas acabarão sendo nulas, para Locations com LocationTypeID
algo diferente de 5
, e isso está perfeitamente bem.
Eu sei que provavelmente preciso de uma expressão de tabela comum recursiva, só não sei por onde começar.
Basicamente, a lógica do pseudo-código para isso é:
- Foreach
Location
noLocationsTable
- Obtenha o
Parent Location
de cadaLocation
, continue recursivamente até que não haja mais pais - Armazene esses dados em cache em uma exibição, para que possam ser facilmente
LEFT JOIN
editados em qualquer outra tabela que faça referência a umLocID
Espero que tudo faça sentido. Obrigado quem puder me ajudar.
Acredito que você possa alcançar o resultado desejado com esta consulta:
De acordo com o documento COM common_table_expression :