SQL relacionar 2 ou mais tabelas utilizando CTE
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
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
Curtidas 0
Respostas
Emerson Nascimento
03/12/2019
publique a query que você já tem e que funciona
GOSTEI 0
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
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
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