PDA

View Full Version : Aiuto in T-SQL


Gremo
02-05-2007, 13:49
Ciao a tutti.
Ho progettato una tabella molto semplice che modella la struttura a sezioni gerarchiche di un sito.


-- Tabella Section
CREATE TABLE [Section]
(
SectionId INT IDENTITY(1,1) CONSTRAINT PK_Menu PRIMARY KEY,
[Position] INT,
BelongsTo NVARCHAR(255),
ParentId INT
)


ParentId specifica qual è la sezione genitore della riga corrente

Ora ho bisogno di una query che mi selezioni tutte le sezioni, escluse le sezioni foglie ma che includa le sezioni top-level


Esermpio:
Section #1
--> SubSection #1
---> SubSubSection #1
--> SubSection #2
Section #2

Vorrei:
1) escludere SubSubSection #1 perchè si tratta di una foglia
2) comprendere Section #2 perchè si tratta di un elemento top-level
3) comprendere SubSection #2 per lo stesso motivo



Ho provato questa soluzione: (non considerate in join con la tabella Section_Locale)


SELECT
S1.SectionId AS ID,
SL.Name AS [NAME],
S1.Position AS POSITION,
S1.ParentId AS PARENTID,
COUNT(S2.ParentId) AS Childs
FROM
[Section] AS S1 LEFT JOIN [Section] AS S2 ON S1.SectionId = S2.ParentId
INNER JOIN Section_Locale AS SL ON S1.SectionId = SL.SectionId
GROUP BY S2.ParentId, S1.ParentId, S1.SectionId, S1.Position,SL.Name
HAVING COUNT(S2.ParentId) > 0
ORDER BY S1.SectionId, S1.ParentId


soluzione che non funziona in quanto mi esclude le sezioni top-level e prende solo le sezioni che hanno almeno 1 figlio
Il problema principale è:
1) come faccio a discriminare tra SubSubSection #1 e SubSection #2: entrambe hanno figli zero e parent id not null, tuttavia vorrei escludere SubSubSection #1 ed includere SubSection #2