Visto che utilizzi SQL Server 2005, ti propongo la soluzione con le CTE utilizzate ricorsivamente:
USE tempdb;
GO
CREATE TABLE dbo.TBL_CATEGORIA
(
ID int NOT NULL
, Categoria varchar(30) NOT NULL
, IDPadre int NULL
, CONSTRAINT PK_TBL_CATEGORIA PRIMARY KEY CLUSTERED
(
ID
)
)
GO
INSERT INTO dbo.TBL_CATEGORIA (ID, Categoria, IDPadre)
VALUES (1, 'TUTTE', NULL)
INSERT INTO dbo.TBL_CATEGORIA (ID, Categoria, IDPadre)
VALUES (2, 'FERRAMENTA', 1)
INSERT INTO dbo.TBL_CATEGORIA (ID, Categoria, IDPadre)
VALUES (3, 'VITI', 2)
INSERT INTO dbo.TBL_CATEGORIA (ID, Categoria, IDPadre)
VALUES (4, 'VARIE', 1)
INSERT INTO dbo.TBL_CATEGORIA (ID, Categoria, IDPadre)
VALUES (5, 'BULLONI', 2)
INSERT INTO dbo.TBL_CATEGORIA (ID, Categoria, IDPadre)
VALUES (6, 'VITI A CROCE', 3)
GO
ALTER TABLE dbo.TBL_CATEGORIA
ADD CONSTRAINT FK_TBL_CATEGORIA_TBL_CATEGORIA
FOREIGN KEY (IDPadre)
REFERENCES dbo.TBL_CATEGORIA (ID)
GO
;WITH Categorie (ID, Categoria, IDPadre, Livello, Ordine) AS
(
SELECT
ID
, Categoria
, IDPadre
, Livello = 0
, Ordine = CAST(ID AS varchar(10))
FROM
dbo.TBL_CATEGORIA
WHERE
IDPadre IS NULL
UNION ALL
SELECT
C.ID
, C.Categoria
, C.IDPadre
, Livello = CT.Livello + 1
, Ordine = CAST(Ordine + CAST(C.ID AS varchar(10)) AS varchar(10))
FROM
dbo.TBL_CATEGORIA AS C
JOIN Categorie AS CT ON C.IDPadre = CT.ID
)
SELECT
cast(REPLICATE('|- ', Livello) + Categoria AS varchar(50))
FROM
Categorie
ORDER BY Ordine
/*
--------------------------------------------------
TUTTE
|- FERRAMENTA
|- |- VITI
|- |- |- VITI A CROCE
|- |- BULLONI
|- VARIE
*/
Come puoi notare la CTE (la with per intenderci) possiede una parte fissa, quella in cui ricavo il primo padre della gerarchia (che raggruppa tutti i record di livello inferiore), ed una ricorsiva, che è quella dopo la UNION ALL. Fai attenzione che, come diceva correttamente Lorenzo, devi avere un livello a monte (TUTTI) per visualizzare le tue FERRAMENTA e VARIE.
Dall'ultima select puoi andare in join sulle ulteriori tabelle che ti servono per ottenere tutti i dati che ti servono.
Ciao!
Alx81 =)
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org