Eu tenho duas tabelas que compartilham um relacionamento muitos para muitos. Os relacionamentos são armazenados em uma terceira tabela.
CREATE TABLE Person
(
Id int NOT NULL,
Name varchar(255) NOT NULL,
PRIMARY KEY (Id)
)
CREATE TABLE Filenodes
(
Id hierarchyid NOT NULL,
Name varchar(255) NOT NULL,
PRIMARY KEY (Id)
)
CREATE TABLE PersonFilenodes
(
FileId hierarchyid NOT NULL,
PersonId int NOT NULL,
PRIMARY KEY (FileId, PersonId)
)
Preciso selecionar todos os nós de arquivo que pertencem a uma pessoa, bem como todos os arquivos que são ancestrais desses arquivos.
Eu sei selecionar todos os Filenodes
que pertencem a uma determinada pessoa:
SELECT Id, Name
FROM PersonFilenodes
JOIN Filenodes on Filenodes.Id = PersonFilenodes.FileId
WHERE Id = @personId
Graças a marc_s , também sei como selecionar todos os ancestrais de um determinado filenode :
SELECT Id, Name
FROM Filenodes
WHERE @filenodeId.IsDescendantOf(Id) = 1
Simplesmente não consigo descobrir como combinar as duas consultas para obter o conjunto de resultados de que preciso. Como posso selecionar todos os nós de arquivo que pertencem a uma pessoa, bem como todos os arquivos que são ancestrais desses arquivos?
Acho que você precisa:
A consulta interna é uma subconsulta correlacionada que usa dois parâmetros:
@personId
, que é um parâmetro real ef.Id
, que é o ID do nó de arquivo da linha atual da consulta externa.