Avatar billede c-sharp Nybegynder
10. september 2007 - 21:15 Der er 8 kommentarer og
2 løsninger

Hjælp til rekursiv sql

Jeg har følgende rekursiv sql sætning :

SELECT t2.* FROM Tekstsider AS t1 JOIN Tekstsider AS t2 ON t1.sideId = t2.hovedid

Hvordan får jeg ovenstående til at starte i en bestemt "node" og derved finde alle under noder til denne?
Avatar billede arne_v Ekspert
10. september 2007 - 21:23 #1
Koder en SP eller skifter til Oracle ...
Avatar billede lorentsnv Nybegynder
11. september 2007 - 11:01 #2
Hvis du bruger SQL Server 2005, er der nu implementeret muligheder for rekursiv sql:
http://www.sqlservercentral.com/columnists/sSampath/recursivequeriesinsqlserver2005.asp

Skifte til Oracle skulle derfor være unødvendig ;-)
Avatar billede lorentsnv Nybegynder
11. september 2007 - 11:05 #3
Chris Wade har også beskrevet rekursive forespørgsler. Se sidste del af artikkelen:

http://blogs.conchango.com/christianwade/archive/2004/11/09/234.aspx
Avatar billede c-sharp Nybegynder
11. september 2007 - 20:03 #4
Man tak for jeres kommentare

lorentsnv kan du evt. give et eksempel hvor sql-sætning tager udgangs punkt i en bestemt node og finder alle under noder til denne?

arne_v Det kunne også være et ekspemel med en Stored procedure
Avatar billede arne_v Ekspert
13. september 2007 - 04:03 #5
Lidt eksperimenteren førte til følgende:

CREATE FUNCTION lookupone(@parent INTEGER) RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @id INTEGER
    DECLARE @idlist VARCHAR(8000)
    SET @idlist = ''
    DECLARE c CURSOR FOR SELECT id FROM stuff WHERE parent = @parent
    OPEN c
    FETCH NEXT FROM c INTO @id
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @idlist = @idlist + ',' + CAST(@id AS VARCHAR(9)) + dbo.lookupone(@id)
        FETCH NEXT FROM c INTO @id
    END
    CLOSE c
    DEALLOCATE c
    RETURN @idlist
END
GO
CREATE PROCEDURE lookup(@name varchar(50))
AS
BEGIN
    DECLARE @id INTEGER
    DECLARE @idlist VARCHAR(8000)
    DECLARE @sql VARCHAR(8000)
    SET @id = (SELECT id FROM stuff WHERE name = @name)
    SET @idlist = CAST(@id AS VARCHAR(9)) + dbo.lookupone(@id)
    SET @sql = 'SELECT * FROM stuff WHERE id IN (' + @idlist + ')'
    EXEC(@sql)
END
GO

Jeg har andre tabel og felt navne, men det burde være til at gennemskue.
Avatar billede arne_v Ekspert
13. september 2007 - 04:09 #6
I Oracle er det bare:

SELECT * FROM stuff START WITH name = 'xxxx' CONNECT BY PRIOR id = parent;
Avatar billede arne_v Ekspert
13. september 2007 - 04:24 #7
I 2005 med den CTE som jeg aldrig havde hørt om før:

WITH x (id, name, parent) AS
(
    SELECT id,name,parent FROM stuff WHERE name = 'xxxx'
    UNION ALL
    SELECT stuff.id,stuff.name,stuff.parent FROM stuff INNER JOIN x ON stuff.parent = x.id
)
SELECT * FROM x
GO
Avatar billede c-sharp Nybegynder
16. september 2007 - 19:43 #8
Jeg takker mange gange, smid nogle svar så fpr i point på følgende måde hvis det er ok med jer:
Arne 20 point
lorentsnv 10 point
Avatar billede lorentsnv Nybegynder
18. september 2007 - 10:07 #9
:-)
Avatar billede arne_v Ekspert
18. september 2007 - 22:44 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester