/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Hvordan laver jeg et loop i SQL?
Fra : Klaus Ambrass


Dato : 22-10-02 11:32

Hej,

jeg har en tabel med noget organisationsstruktur. Både over- og
underdivisioner ligger i samme tabel. Jeg benytter sParent til at pege
"op" på forældredivisionen. Der kan være mange under- men kun een
overdivision. Derfor peger de "op" i stedet for "ned".

Min tabel ser sådan ud:

TblOrganisation.sID:        int, unik
TblOrganisation.sNavn:        string
TblOrganisation.sParent:    int, der peger på "forældreposten"

Jeg skal nu konstruere et loop der finder post #234's sParent. Hvis denne
er 0 (toppen af min organisation) er jeg færdig, ellers skal jeg finde
sParent(sParent(234))... etc. Jeg ved ikke hvor dyb min organisation
(bliv)er, så funktionen skal kaldes indtil den returnerer 0. Resultatet
bliver en række poster i stil med denne:

sID sParent sNavn
------------------------------
234 200 'Division C'
200 19 'Division B'
19 1 'Division A'
1 0 'TopDivision'

Resultatet skal præsenteres for brugeren som en slags DOS-sti:

TopDivision/Division A/Division B/Division C/

Hvordan får jeg omsat det til SQL?

---
Klaus Ambrass
Storstrøms Amt IT

 
 
Jens Gyldenkærne Cla~ (22-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 22-10-02 12:40

Klaus Ambrass skrev:

> Jeg skal nu konstruere et loop der finder post #234's sParent.
> Hvis denne er 0 (toppen af min organisation) er jeg færdig,

Kig på WHILE i BOL (Books Online).

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Kristian Damm Jensen (22-10-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 22-10-02 12:35

Klaus Ambrass wrote:
>
> Hej,
>
> jeg har en tabel med noget organisationsstruktur. Både over- og
> underdivisioner ligger i samme tabel. Jeg benytter sParent til at pege
> "op" på forældredivisionen. Der kan være mange under- men kun een
> overdivision. Derfor peger de "op" i stedet for "ned".
>
> Min tabel ser sådan ud:
>
> TblOrganisation.sID: int, unik
> TblOrganisation.sNavn: string
> TblOrganisation.sParent: int, der peger på "forældreposten"
>
> Jeg skal nu konstruere et loop der finder post #234's sParent. Hvis denne
> er 0 (toppen af min organisation) er jeg færdig, ellers skal jeg finde
> sParent(sParent(234))... etc. Jeg ved ikke hvor dyb min organisation
> (bliv)er, så funktionen skal kaldes indtil den returnerer 0. Resultatet
> bliver en række poster i stil med denne:
>
> sID sParent sNavn
> ------------------------------
> 234 200 'Division C'
> 200 19 'Division B'
> 19 1 'Division A'
> 1 0 'TopDivision'
>
> Resultatet skal præsenteres for brugeren som en slags DOS-sti:
>
> TopDivision/Division A/Division B/Division C/
>
> Hvordan får jeg omsat det til SQL?

Det gør du ikke.

Se mit og Kim Bach Petersens svar i tråden "Søgning i træstruktur, MySQL
3.23".


--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Kim Bach Petersen (22-10-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 22-10-02 13:52

Et bud til SQL server kunne faktisk være

http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm

men generelt er det nok en bedre løsning at hante data og efterfølgende
bruge programkode til rekursere sig igennem, se nævnte tidligere tråd.

Kim
--
· www.kensho.dk · psykologi og spiritualitet ·



Stefan Kristensen (22-10-2002)
Kommentar
Fra : Stefan Kristensen


Dato : 22-10-02 16:15

> jeg har en tabel med noget organisationsstruktur. Både over- og
> underdivisioner ligger i samme tabel. Jeg benytter sParent til at pege
> "op" på forældredivisionen. Der kan være mange under- men kun een
> overdivision. Derfor peger de "op" i stedet for "ned".
Hej Klaus. Jeg har en procedure, du måske kan bruge. Ret OrgUnit til sID og
OrgUnitSup til sParent så er den vist tæt på.

mvh
Stefan

CREATE PROCEDURE GetOUPath
@OrgUnit varchar(8),
@OUPath varchar(256) OUTPUT
AS
SET @OUPath = "ou=" + @OrgUnit
print "Stating path: " + @OUPath

WHILE NOT ISNULL(@OrgUnit, "x") = "x"
BEGIN
SELECT @OrgUnit = (
SELECT OrgUnitSup
FROM Organization
WHERE OrgUnit = @OrgUnit)
IF NOT ISNULL(@OrgUnit, "x") = "x"
BEGIN
SET @OUPath = @OUPath +", ou=" + @OrgUnit
print @OrgUnit + " added to path"
print @OUPath
END
END
print "****"
print "OUPath: " + ISNULL(@OUPath, "NULL")
GO




Larz (22-10-2002)
Kommentar
Fra : Larz


Dato : 22-10-02 17:20

Klaus Ambrass wrote:

> jeg har en tabel med noget organisationsstruktur. Både over- og
> underdivisioner ligger i samme tabel. Jeg benytter sParent til at pege
> "op" på forældredivisionen. Der kan være mange under- men kun een
> overdivision. Derfor peger de "op" i stedet for "ned".
>
> Min tabel ser sådan ud:
>
> TblOrganisation.sID:        int, unik
> TblOrganisation.sNavn:        string
> TblOrganisation.sParent:    int, der peger på "forældreposten"
>
> Jeg skal nu konstruere et loop der finder post #234's sParent. Hvis denne
> er 0 (toppen af min organisation) er jeg færdig, ellers skal jeg finde
> sParent(sParent(234))... etc. Jeg ved ikke hvor dyb min organisation
> (bliv)er, så funktionen skal kaldes indtil den returnerer 0.

I Oracle skal du bruge CONNECT BY PRIOR...
Noget i stil med:

   SELECT
      sID
      ,sParent
      ,sNavn
   FROM
      TblOrganisation
   START WITH
      sID = 0
   CONNECT BY PRIOR
      sID = sParent

Evt. kan du tilføje SYS_CONNECT_BY_PATH(sNavn,'/') "PATH" til select
listen - så vil feltet "PATH" netop indeholde en sti som du eftersøger.

--
-
Lars
http://coder.dk/sohofaq.php - Uofficiel WOL SOHO 77 FAQ
To mail me remove your pants.


Peter Lykkegaard (22-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 22-10-02 21:01

Som svar på skriblerier forfattet af Klaus Ambrass
>
> jeg har en tabel med noget organisationsstruktur. Både over- og
> underdivisioner ligger i samme tabel. Jeg benytter sParent til at pege
> "op" på forældredivisionen. Der kan være mange under- men kun een
> overdivision. Derfor peger de "op" i stedet for "ned".

Det er faktisk muligt at arbejde med nested sets sammen med SQL
Men det kræver nogle tweaks i din struktur

Joe Celko: SQL for Smarties
Link til amazon
http://tinyurl.com/2556

Her er lidt diskussioner omkring metoden på http://dbforums.com
http://tinyurl.com/254z

mvh/Peter Lykkegaard




Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste