SQL relacionar 2 ou mais tabelas utilizando CTE

03/12/2019

14

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

Responder

Posts

03/12/2019

Emerson Nascimento


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

Responder

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
Responder

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


Responder

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.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar