salve
giantex wrote:
..
Solo che così non riesco a selezionare una categoria qualsiasi e farmi estrarre tutti i fornitori che ci sono sulle sottocategorie. Questi fornitori potrebbero essere sia sotto di un livello o anche di molti livelli.
e' buona consuetudine provvedere anche un minimo di DDL e relativi statement di INSERT INTO in modo da non costringere gli altri ad inventarsi metadati e dati stessi...
al di la' di cio', sinceramente non penso di aver compreso il problema.. SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.tblSupplierCategories (
catID int,
catParentID int NULL,
catDescription varchar (10)
);
CREATE TABLE dbo.tblUsers (
usrID int,
Nome varchar(5),
usrActive bit
);
CREATE TABLE dbo.tblUserCategory (
ucaUserID int,
ucaCategoryID int
);
GO
INSERT INTO dbo.tblSupplierCategories VALUES ( 1, NULL, '.' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 2, 1, '.1' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 3, 1, '.2' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 4, 2, '.1.1' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 5, 4, '.1.1.1' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 6, 4, '.1.1.2' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 7, 3, '.2.1' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 8, 3, '.2.2' ); INSERT INTO dbo.tblSupplierCategories VALUES ( 9, 8, '.2.2.1' );
INSERT INTO dbo.tblUsers VALUES ( 1 , 'e' , 1 );
INSERT INTO dbo.tblUsers VALUES ( 2 , 'f' , 1 );
INSERT INTO dbo.tblUsers VALUES ( 3 , 'g' , 1 );
INSERT INTO dbo.tblUsers VALUES ( 4 , 'h' , 1 );
INSERT INTO dbo.tblUserCategory VALUES ( 1, 2 );
INSERT INTO dbo.tblUserCategory VALUES ( 1, 9 );
INSERT INTO dbo.tblUserCategory VALUES ( 2, 4 );
INSERT INTO dbo.tblUserCategory VALUES ( 2, 9 );
INSERT INTO dbo.tblUserCategory VALUES ( 2, 5 );
INSERT INTO dbo.tblUserCategory VALUES ( 3, 6 );
INSERT INTO dbo.tblUserCategory VALUES ( 4, 2 );
INSERT INTO dbo.tblUserCategory VALUES ( 4, 9 );
INSERT INTO dbo.tblUserCategory VALUES ( 4, 8 );
GO
DECLARE @Root int;
SET @Root = 1;
with tree(catID,catParentID,catDescription) as
(
select
tblSupplierCategories.catID,tblSupplierCategories.catParentID,tblSupplierCategories.catDescription from tblSupplierCategories
where tblSupplierCategories.CatID= @Root
id del padre
union all
select
tblSupplierCategories_1.catID,tblSupplierCategories_1.catParentID,tblSupplierCategories_1.catDescription from tblSupplierCategories tblSupplierCategories_1
inner join tree t on t.catID=tblSupplierCategories_1.catParentID )
select catID,catParentID,catDescription, u.*
from tree t
LEFT JOIN dbo.tblUserCategory uc ON uc.ucaCategoryID = t.catID LEFT JOIN dbo.tblUsers u ON u.usrID = uc.ucaUserID
ORDER BY catDescription;
GO
DROP TABLE dbo.tblSupplierCategories, dbo.tblUserCategory, dbo.tblUsers; --<----------
catID catParentID catDescription usrID Nome usrActive ---------
---------
------------
---------
---
-------
1 NULL . NULL NULL NULL 2 1 .1 1 e 1
2 1 .1 4 h 1
4 2 .1.1 2 f 1
5 4 .1.1.1 2 f 1
6 4 .1.1.2 3 g 1
3 1 .2 NULL NULL NULL 7 3 .2.1 NULL NULL NULL 8 3 .2.2 4 h 1
9 8 .2.2.1 1 e 1
9 8 .2.2.1 2 f 1
9 8 .2.2.1 4 h 1
l'albero mi pare venga ritornato correttamente, popolato come richiesto.. modificando il nodo di partenza, @Root, ottieni il ramo interessante e cosi' via...
saluti