[SQL] Query en hierarchie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik 2 tabellen: tabel "Code" beschrijft een hierarchie en tabel "Item" bevat items welke verwijzen naar een item in de hierarchie. Deze voorbeeld data zit erin:

INSERT INTO Code VALUES
(1, NULL, 'Root'),
(2, 1, 'Child1'),
(3, 1, 'Child2'),
(4, 2, 'Child3'),
(5, 3, 'Child4'),
(6, 4, 'Child5')

INSERT INTO Item VALUES
(1, 2, 'Item1'),
(2, 3, 'Item2'),
(3, 4, 'Item3'),
(4, 5, 'Item4'),
(5, 6, 'Item5')

Nu wil ik op basis van Code records uit de Item tabel filteren. Bijvoorbeeld alle items welke verbonden zijn aan Child5 en hoger. Dat zijn dus Item5 (zit aan Child5) en Item3 (zit aan Child3).

Nu gaat het in de praktijk om zeer veel records. Daarom is het van belang dat de query's snel antwoord geven. Hoe is dit op te lossen? Kan dit alleen met SQL?

Uiteraard hoef ik geen kant en klare oplossing, maar ik kan me voorstellen dat dit al een keer is bedacht, en wil niet opnieuw het wiel uitvinden.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Hier heb je een artikel die over hiërarchische data gaat: http://www.sitepoint.com/article/hierarchical-data-database/

je zegt dat Item1 aan Child2 zit, maar ik zie niet hoe, want Item1 heeft als 2e getal 2 staan ( ik ga ervanuit dat dat de FK naar de Code tabel is ). Bij Id 2 in de code tabel zie ik Child1 staan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Woy schreef op vrijdag 24 april 2009 @ 11:52:
Hier heb je een artikel die over hiërarchische data gaat: http://www.sitepoint.com/article/hierarchical-data-database/

je zegt dat Item1 aan Child2 zit, maar ik zie niet hoe, want Item1 heeft als 2e getal 2 staan ( ik ga ervanuit dat dat de FK naar de Code tabel is ). Bij Id 2 in de code tabel zie ik Child1 staan.
Je hebt gelijk, foutje in mijn voorbeeld. Aangepast.
Ik zal je linkje even lezen, bedankt.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Niet helemaal mijn forte, maar als je database recursive common table expressions ondersteunt dan is het daarmee mogelijk. Ik weet iig dat Firebird en MS SQL Server 2005 en hoger dit ondersteunen.

Je krijgt dan iets als
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
WITH RECURSIVE hierarchy AS
   SELECT itemid, parentid, name
   FROM Code
   WHERE parentid IS NULL
   UNION ALL
   SELECT c.itemid, c.parentid, c.name
   FROM Code c INNER JOIN hierarchy h
   ON c.parentid = h.itemid
SELECT v.name
FROM hierarchy h INNER JOIN Value v
ON h.itemid = v.itemid
WHERE h.parentid = 4


Dit zal wel niet helemaal correct zijn, want ik heb nog nooit serieus met recursive CTEs gewerkt, maar volgens mij zou dit ongeveer wel een oplossingsrichting zijn.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Kunnen er meerdere childs aan 1 item hangen? Volgens je database voorbeeldje wel, maar aan je verhaal lijkt het een 1 op 1 relatie. In dat geval vraag ik me af waarom je dit in twee tabellen opslaat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Oracle kent weer START/Connect constructie..

http://www.adp-gmbh.ch/ora/sql/connect_by.html

In ANSI SQL kan het niet denk ik, moet je het uitprogrammeren in de taal die je gebruikt om de databse te accessen, zie .b.v. link van Woy.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
leuk_he schreef op vrijdag 24 april 2009 @ 12:53:
Oracle kent weer START/Connect constructie..

http://www.adp-gmbh.ch/ora/sql/connect_by.html

In ANSI SQL kan het niet denk ik, moet je het uitprogrammeren in de taal die je gebruikt om de databse te accessen, zie .b.v. link van Woy.
WITH / WITH RECURSIVE is in ieder geval in SQL2003 (ISO/IEC 9075) gedefinieerd (optional features T121, T122, T131 en T132), mogelijk was deze ook al in eerdere versie van de standaard gedefinieerd.
Pagina: 1