Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


rekursiv sql?

Postades av 2003-03-28 08:08:30 - Olof Andreassen, i forum sql-server/msde, Tråden har 7 Kommentarer och lästs av 1436 personer

(SQL server 2k)

3 tabeller:

<code>
tblUsers
---------
usrIdent - uniqueidentifier (primary key)
...
---------
tblMemeberOf
---------
mboIdent - int (primary key) <-|
... |
mboParent - int ------------------| (allow nulls)
(dvs relation till mboIdent)

tblUsrMbo (junction)
---------
...
usrmboUser - int (relation till tblUsers.usrIdent)
usrmboMember - int (relation till tblMemberOf.mboIdent)
</code>
En relations kedja i denna herarki kan se ut som följande:
<code>
Elev-|
|-Inriktning-|
|-Programmering-|
|- Årskurs 3 -|
|- MinKlass
</code>
Då användarna kommer att bli members eller få en relation i junctiontabeln
till någon av noderna så vill jag att de skall kunna se den node de är medlemar
i, men även alla överliggande.

Ex 1:
Dvs är jag medlem i 'Programmering' vill jag få returnerat 'Programmering', 'inriktning 'samt 'elev'.

Ex 2:
Och är jag medlem i 'MinKlass' vill jag få ut hela den underliggande node kedjan.


Mycket tacksam för hjälp:)!


Svara

Sv: rekursiv sql?

Postades av 2003-03-28 10:54:31 - Olof Andreassen

Återigen, jag är såååå tacksam för all hjälp jag får i detta forum...
Återigen blev jag tvungen att lösa mitt problem själv.......

Frågor som jag fick besvarade igenom olika tester jag fick genomföra:

Kan en lagrad procedur kalla på sig själv? Svar: JA

Kod exempel:

<code>
if exists(select name from sysobjects where name='sp_GetMemberChain')
drop proc sp_GetMemberChain
go
create proc sp_GetMemberChain
@ParentIn int,
@ParentOut int output
as
declare @Name char(25)

select @ParentOut = tblMemberOf.mboParent from tblMemberOf where tblMemberOf.mboIdent = @ParentIn

if(@ParentOut is not null)
begin
exec sp_GetMemberChain @ParentOut,@ParentOut
end

select @Name = tblMemberOf.mboName from
tblMemberOf where tblMemberOf.mboIdent = @ParentOut
print @Name

go
</code>

Problem löst.


Svara

Sv: rekursiv sql?

Postades av 2003-03-28 11:26:40 - Andreas Hillqvist

Det är inte bra med recursiva anrop i SQL Server. Finns dessutom en begränsning i hur mångha anrop du kan göra.

I ditt fall kan det undvikas:
<code>
If exists(select name from sysobjects where name='sp_GetMemberChain')
drop proc sp_GetMemberChain
go
CREATE PROC sp_GetMemberChain
@mboIdent int,
@usrIdent int
AS

DECLARE @Parent int
DECLARE @Name char(25)

SELECT @Parent = tblMemberOf.mboParent, @Name = tblMemberOf.mboName
FROM tblMemberOf
WHERE tblMemberOf.mboIdent = @mboIdent

WHILE (@Parent Is Not Null)
BEGIN
PRINT @Name

SET @mboIdent = @Parent
SET @Parent = Null

SELECT @Parent = tblMemberOf.mboParent, @Name = tblMemberOf.mboName
FROM tblMemberOf
WHERE tblMemberOf.mboIdent = @mboIdent
END
GO
</code>
Tror denna kommer vara effektivare eftersom den dessutom hämtar namnet i samma SQL sats som förälder.

Egentligen kanske man borde använda en deklarerad variabel än parametern @mboIdent i loopen.


Svara

Sv: rekursiv sql?

Postades av 2003-03-28 11:59:53 - Olof Andreassen

...såg att jag hade skrivit fel kod i min lösning, @name variabeln skall deklareras inuti if sattsen och inte likadant som jag gjorde där..:)

Vad är det som gör rekursiva sp's i sql-server ineffektiva då? Vad är nackdelarna?


Svara

Sv: rekursiv sql?

Postades av 2003-03-28 12:05:47 - Olof Andreassen

Tack så mycket för lösningen skall jag tillägga:) Höll på att gömma tacka för hjälpen..:)


Svara

Sv: rekursiv sql?

Postades av 2003-03-28 14:41:22 - Christoffer Hedgate

Eftersom SQL är ett mängdbaserat språk så bör man försöka att skriva SQL-satser som opererar på hela mängder, inte procedurell kod som t ex jobbar rad-för-rad eller rekursivt. Det finns alternativa metoder till att hantera hierarkiska strukturer i SQL, t ex Joe Celkos metod Nested Sets.

Som Andreas sa är SQL Server dessutom begränsad till 32 nivåers rekursion.


Svara

Sv: rekursiv sql?

Postades av 2003-03-28 15:29:37 - Andreas Hillqvist

En länk som tar upp Joe Celkos:
http://www.dbmsmag.com/9603d06.html


Svara

Sv:rekursiv sql?

Postades av 2005-01-28 13:07:10 - Per Persson

Jag tycker att http://www.sitepoint.com/article/hierarchical-data-database är bättre.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
563
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies