SELECT SQL Server 2000

lunedì 28 maggio 2007 - 11.50

fotw Profilo | Newbie

Ciao a tutti

Sto facendo dei controlli su una tabella che contiene delle distinte basi....

Esiste su SQL server un comando tipo CONNECT BY .... START WITH (spero di averlo scirtto bene) presente nel comando SELECT di Oracle?

Devo fare delle SELECT nidificate su n livelli

Grazie e ciao

alx_81 Profilo | Guru

>Ciao a tutti
Ciao!


>Sto facendo dei controlli su una tabella che contiene delle distinte
>basi....
>Esiste su SQL server un comando tipo CONNECT BY .... START WITH
>(spero di averlo scirtto bene) presente nel comando SELECT di
>Oracle?
Ho guardato un pochino quello che fa quel costrutto, ma a te serve ottenere una gerarchia?
perchè con le CTE (common table expression), fare chiamate ricorsive è una cosa molto veloce da implementare..
però non sono sicuro di aver capito quale sia la tua esigenza..
Se provi a farmi capire quello che ti serve, magari con un bell'esempio in SQL (create, insert e il risultato che vuoi ottenere), potrei aiutarti meglio..
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

fotw Profilo | Newbie

Questo e' l'esempio che mi hai chiesto:


CREATE TABLE distinte (
padre VARCHAR(15) NOT NULL,
figlio VARCHAR(15) NOT NULL,
quantita DECIMAL(14,6) NOT NULL);


INSERT INTO distinte VALUES ('A1', 'B1', 1); --Ha figli
INSERT INTO distinte VALUES ('A1', 'B2', 2); --Ha figli
INSERT INTO distinte VALUES ('A1', 'B3', 1.5);

INSERT INTO distinte VALUES ('B1', 'C1', 2.5);
INSERT INTO distinte VALUES ('B1', 'C2', 5); --Ha figli
INSERT INTO distinte VALUES ('B1', 'C3', 0.78);
INSERT INTO distinte VALUES ('B1', 'C4', 1.25);

INSERT INTO distinte VALUES ('B2', 'C5', 2);
INSERT INTO distinte VALUES ('B2', 'C2', 1); --Ha figli

INSERT INTO distinte VALUES ('C2', 'D1', 1);
INSERT INTO distinte VALUES ('C2', 'D2', 1);
INSERT INTO distinte VALUES ('C2', 'D3', 1.7);


SELECT * FROM distinte (con opzione CONNECT BY .... START WITH);
produceva il seguente risultato

level padre figlio quantita
----- --------------- --------------- ----------------
1 A1 B1 1.000000
2 B1 C1 2.500000
2 B1 C2 5.000000
3 C2 D1 1.000000
3 C2 D2 1.000000
3 C2 D3 1.700000
2 B1 C3 .780000
2 B1 C4 1.250000
1 A1 B2 2.000000
2 B2 C5 2.000000
2 B2 C2 1.000000
3 C2 D1 1.000000
3 C2 D2 1.000000
3 C2 D3 1.700000
1 A1 B3 1.500000

Ho indicato la colonna level (su oracle se ricordo bene si chiamava pseudo-colonna)
in quanto veniva gestita direttamente dalla SELECT ed indicava il livello di
nidificazione della SELECT ed è quasi indispensabile averla per capire quando
si cambia di livello.
Chiaramente i livelli possono essere infiniti e non ci sono ricorsività infinite
in quanto esiste un apposito controllo (LOW LEVEL CODE)

Grazie e ciao

DROP TABLE distinte;

lbenaglia Profilo | Guru

>Questo e' l'esempio che mi hai chiesto:
<SNIP>

Questa è una soluzione basata su una Common Table Expression ricorsiva (per SQL Server 2005):

USE tempdb; CREATE TABLE dbo.distinte ( padre VARCHAR(15) NOT NULL, figlio VARCHAR(15) NOT NULL, quantita DECIMAL(14,6) NOT NULL); INSERT INTO dbo.distinte VALUES ('A1', 'B1', 1); --Ha figli INSERT INTO dbo.distinte VALUES ('A1', 'B2', 2); --Ha figli INSERT INTO dbo.distinte VALUES ('A1', 'B3', 1.5); INSERT INTO dbo.distinte VALUES ('B1', 'C1', 2.5); INSERT INTO dbo.distinte VALUES ('B1', 'C2', 5); --Ha figli INSERT INTO dbo.distinte VALUES ('B1', 'C3', 0.78); INSERT INTO dbo.distinte VALUES ('B1', 'C4', 1.25); INSERT INTO dbo.distinte VALUES ('B2', 'C5', 2); INSERT INTO dbo.distinte VALUES ('B2', 'C2', 1); --Ha figli INSERT INTO dbo.distinte VALUES ('C2', 'D1', 1); INSERT INTO dbo.distinte VALUES ('C2', 'D2', 1); INSERT INTO dbo.distinte VALUES ('C2', 'D3', 1.7); WITH CTE_Distinte([level], padre, figlio, quantita) AS ( /* Anchor member */ SELECT 1, padre, figlio, quantita FROM dbo.distinte WHERE padre = 'A1' UNION ALL /* Recursive member */ SELECT CTE.level + 1, D.padre, D.figlio, D.quantita FROM dbo.distinte AS D JOIN CTE_Distinte AS CTE ON D.padre = CTE.figlio ) SELECT * FROM CTE_Distinte ORDER BY [level]; /* level padre figlio quantita ----------- --------------- --------------- ---------- 1 A1 B1 1.000000 1 A1 B2 2.000000 1 A1 B3 1.500000 2 B2 C5 2.000000 2 B2 C2 1.000000 2 B1 C1 2.500000 2 B1 C2 5.000000 2 B1 C3 0.780000 2 B1 C4 1.250000 3 C2 D1 1.000000 3 C2 D2 1.000000 3 C2 D3 1.700000 3 C2 D1 1.000000 3 C2 D2 1.000000 3 C2 D3 1.700000 (15 row(s) affected) */ DROP TABLE dbo.distinte;

Per maggiori dettagli:

"Recursive Queries Using Common Table Expressions"
http://msdn2.microsoft.com/en-us/library/ms186243.aspx

>Grazie e ciao
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

>Questo e' l'esempio che mi hai chiesto:
Purtroppo ho notato dal titolo che parli di SQL Server 2000..

quindi prova a guardare se ti può essere comodo questo esempio:
http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=9

Lorenzo ti ha già fatto l'esempio con le query ricorsive tramite CTE, eccoti un link in più..
http://www.microsoft.com/italy/technet/community/mvp/editoriali/query.mspx

spero possa esserti di aiuto.
ciao

Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5