Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Untill

[Resolvido] Consultar categorias a partir do 3 nível

Recommended Posts

Admito, infelizmente SQL não é meu ponto forte, porém não faço o perfil de pessoa que vive de pedir ajuda, só recorri ao fórum porque realmente não achei solução viável sem afetar a performance.

 

Possuo uma base de dados com a seguinte estrutura;

 

CREATE TABLE [dbo].[tbDept](
[idDept] [int] NOT NULL,
[dsName] [varchar](40) NOT NULL,
[dsDescription] [varchar](100) NULL,
[idParent] [int] NULL,
[dsDeptImg] [varchar](30) NULL,
[idActiveFlag] [tinyint] NOT NULL,
[nuDispOrder] [int] NOT NULL,
[dsMenuImg] [varchar](30) NULL,
[dsCustomHtml] [varchar](2000) NULL,
[nuColumns] [tinyint] NULL,
[idLinkGroup] [int] NULL,
[idStaticText] [int] NULL,
[idPriceRangeGroup] [int] NULL,
[fgRecommend] [tinyint] NOT NULL,
[fgManualShortcut] [tinyint] NOT NULL,
[dsManualShortcut] [varchar](255) NOT NULL,
[dsMetaDescription] [varchar](1000) NULL,
[dsMetaKeywords] [varchar](1000) NULL,
[dsMetaTitle] [varchar](1000) NULL,
CONSTRAINT [PK__tbDept__2AA05119] PRIMARY KEY CLUSTERED 
(
[idDept] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


 

Ou seja um catalogo de categorias onde as subcategorias ficam presas a suas antecessoras pelo idParent, preciso criar uma procedure para consultar as categorias em mais de 3 níveis exemplo: Select * from tbDept where idDept = 1 Or idParent = 1 porém isso não iria trazer as categorias do terceiro nível conseguem imaginar um modo de trazer estes valores sem afetar a performance drasticamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Indices? Fill Factor?

Fugiria de sub-select

Pensaria em trabalhar com Function ou procedure, mas analisando o plano de execução.

você consegue identificar o "gargalo" ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado galera, a seguinte solução resolveu meu problema;

 

with c as (
 select idDept
 from dbo.tbDept b 
 where b.idDept = 1
   union all 
 SELECT b.idDept
 from dbo.tbDept b join c on b.idParent = c.idDept)
select b.idDept, b.dsName, b.idParent
from c join dbo.tbDept b on c.idDept = b.idDept
order by 1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.