SQL relacionar 2 ou mais tabelas utilizando CTE

SQL Server

SQL

03/12/2019

bom dia,

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

Daniel Leite

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

03/12/2019


publique a query que você já tem e que funciona

GOSTEI 0
Daniel Leite

Daniel Leite

03/12/2019


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
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

03/12/2019



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


GOSTEI 0
Daniel Leite

Daniel Leite

03/12/2019



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.
GOSTEI 0
POSTAR