SQL relacionar 2 ou mais tabelas utilizando CTE
03/12/2019
0
Recentemente postei no fórum um dificuldade (já resolvida) em montar um query para SQL Server para exibir dados de um relação hierárquica de um árvore de ativos. A árvore possui até 10 níveis e conseguir desenvolver a Query usando CTE e UNION ALL. Tudo funcionando bem até que ...
... foi solicitada a inclusão dos atributos desses ativos para serem exibidos em colunas junto com o ativo correspondente. (abaixo representação do report)
Em um outro relatório utilizo a Query abaixo para extrair um relatório de atributos por ativos
---
FROM Ativos AA
INNER JOIN ValorAtributos ON VA.Id = AA.RecordId
INNER JOIN Atributos A ON A.Id = VA.AttributeId
LEFT JOIN ValorPermitidoAtributo VPA ON VA.AttributeValueId = VPA.Id
---
Para exibir os ativos como abaixo (sem os atributos) estou utilizando CTE com UNION ALL e funcionou perfeitamente chegando ao nível 10.
Porém a CTE não aceita a utilização de outra INNER JOIN.
Gostaria de alguma ideia, um norte para poder estruturar essa Query, se é que isso seja possível.
+----------------+--------------+-------------------------------+------------------------+--------------------------------+--------------+------------------+------------------------+
| Ativo | NívelId | Atributos | Valor Atributo | Ativo | NívelId | Atributos | Valor Atributo |
+----------------+--------------+-------------------------------+------------------------+----------------+--------------+----------------------------------+------------------------+
| SrvDELL | 01 | Modelo | T160 | Fonte Redundante | 02 | Potencia | 750W |
+----------------+--------------+--------------------------------+-----------------------+----------------+--------------+----------------------------------+------------------------+
Banco de Dados: SQL Server 2012
Tabelas relacionadas 4 : Ativos | Atributos | ValorAtributos | ValorPermitidoAtributo
Daniel Leite
Posts
03/12/2019
Daniel Leite
publique a query que você já tem e que funciona
WITH ListaHierarquia_CTE AS
(
SELECT AT1.Id,
AT1.Cod,
AT1.Descricao,
AT1.Nivel,
AT1.IdAtivoPai,
1 AS Nivel
FROM Ativos AT1
WHERE AT1.IdAtivoPai IS NULL
UNION ALL
SELECT AT2.Id,
AT2.Cod,
AT2.Descricao,
AT2.Nivel,
AT2.IdAtivoPai,
Nivel + 1
FROM Ativos AT2
INNER JOIN ListaHierarquia_CTE CTE ON AT2.ParentAssetId = CTE.Id
)
SELECT CTE.Id AS IdAtivo,
CTE.Cod AS CodAtivo,
CTE.Descricao AS Descrição,
CTE.Nivel AS NivelAtivo,
N1.Id AS IdAtivo,
N1.Cod AS CodAtivo,
N1.Descricao AS Descrição,
N1.Nivel AS NivelAtivo,
N2.Id AS IdAtivo,
N2.Cod AS CodAtivo,
N2.Descricao AS Descrição,
N2.Nivel AS NivelAtivo,
N3.Id AS IdAtivo,
N3.Cod AS CodAtivo,
N3.Descricao AS Descrição,
N3.Nivel AS NivelAtivo
FROM ListaHierarquia_CTE CTE
INNER JOIN Ativos N1 ON N1.IdAtivoPai = CTE.Id
INNER JOIN Ativos N2 ON N2.IdAtivoPai = N1.Id
INNER JOIN Ativos N3 ON N3.IdAtivoPai = N2.Id
WHERE N3.Nivel = 4
03/12/2019
Emerson Nascimento
porque você não coloca os atributos na instrução que traz o dados?
tente algo assim:
SELECT CTE.Id AS IdAtivo, CTE.Cod AS CodAtivo, CTE.Descricao AS Descrição, CTE.Nivel AS NivelAtivo, N1.Id AS IdAtivo, N1.Cod AS CodAtivo, N1.Descricao AS Descrição, N1.Nivel AS NivelAtivo, N2.Id AS IdAtivo, N2.Cod AS CodAtivo, N2.Descricao AS Descrição, N2.Nivel AS NivelAtivo, N3.Id AS IdAtivo, N3.Cod AS CodAtivo, N3.Descricao AS Descrição, N3.Nivel AS NivelAtivo FROM ListaHierarquia_CTE CTE INNER JOIN Ativos N1 ON N1.IdAtivoPai = CTE.Id INNER JOIN Ativos N2 ON N2.IdAtivoPai = N1.Id INNER JOIN Ativos N3 ON N3.IdAtivoPai = N2.Id LEFT JOIN ValorAtributos ON VA.Id = N3.Id LEFT JOIN Atributos A ON A.Id = VA.AttributeId LEFT JOIN ValorPermitidoAtributo VPA ON VPA.Id = VA.AttributeValueId WHERE N3.Nivel = 4
06/12/2019
Daniel Leite
porque você não coloca os atributos na instrução que traz o dados?
tente algo assim:
SELECT CTE.Id AS IdAtivo, CTE.Cod AS CodAtivo, CTE.Descricao AS Descrição, CTE.Nivel AS NivelAtivo, N1.Id AS IdAtivo, N1.Cod AS CodAtivo, N1.Descricao AS Descrição, N1.Nivel AS NivelAtivo, N2.Id AS IdAtivo, N2.Cod AS CodAtivo, N2.Descricao AS Descrição, N2.Nivel AS NivelAtivo, N3.Id AS IdAtivo, N3.Cod AS CodAtivo, N3.Descricao AS Descrição, N3.Nivel AS NivelAtivo FROM ListaHierarquia_CTE CTE INNER JOIN Ativos N1 ON N1.IdAtivoPai = CTE.Id INNER JOIN Ativos N2 ON N2.IdAtivoPai = N1.Id INNER JOIN Ativos N3 ON N3.IdAtivoPai = N2.Id LEFT JOIN ValorAtributos ON VA.Id = N3.Id LEFT JOIN Atributos A ON A.Id = VA.AttributeId LEFT JOIN ValorPermitidoAtributo VPA ON VPA.Id = VA.AttributeValueId WHERE N3.Nivel = 4
Obrigado pela ajuda,
ao inserir desta forma não tenho retorno de dado algum.
Lendo o documentação do CTE existe realmente limitações para uso do INNER JOIN.
Estou fazendo novos teste por aqui qualquer novidade publico aqui também.
Clique aqui para fazer login e interagir na Comunidade :)