blueeyephoenix
Goto Top

SQL Tabelle Schleife für Ergebnis

Hallo Community,

ich habe hier ein Problem mit SQL und zwar habe ich eine Tabelle mit Kategorien die sich wie folgt aufbaut:

KategoryID KategoryParentID Categorylvl
500 300 3
300 200 2
200 200 1

Ich habe ein Objekt in einer Tabelle Objekte mit der der Kategorienummer 30506

ObjektNR KategoryID
1 500

und möchte nun über einen Join Befehl die Kategorien Tabelle anhängen aber so das mir am ende nur der Categorylvl 1 angezeigt wird.

Inetwa so :

ObjektNr. Kategorylvl Hauptkategory
1 1 200

Dabei ist mein Problem das ich nicht weiß wie ich eine Schleife für die Tabelle Kategorien erstelle und runterbreche auf den Lvl1

Bei mir sieht es zur Zeit noch so aus

ObjektNR Kategorylvl Hauptkategory
1 300 3

Select ObjektNr, kategoryParentID as Kategorylvl, Categorylvl as Hauptkategory 
from Objekte 
join Kategorien
on objekte.KategoryID=Kategorien.KategoryID 

Hoffe mein Prolbem ist verständlich und mir kann einer Verraten mit welchem befehl ich das umsetzten könnte.

Vielen Dank und liebe Grüße

Content-Key: 1213147637

Url: https://administrator.de/contentid/1213147637

Printed on: April 27, 2024 at 15:04 o'clock

Member: akretschmer
akretschmer Aug 31, 2021 at 08:58:42 (UTC)
Goto Top
je nach verwendeter DB suchst Du wohl nach rekursiven Abfragen.
Member: HubertvonUW
HubertvonUW Aug 31, 2021 at 08:58:44 (UTC)
Goto Top
Hi,
dein Problem ist nicht ganz klar.
In welchem Zusammenhang steht die KategorieID 500 zur KategoryID 200?
Du willst ja zum Objekt 1 mit KatID 500 die Werte der KatID 200.

lg
Member: ukulele-7
Solution ukulele-7 Aug 31, 2021 at 09:06:02 (UTC)
Goto Top
Ich muss das immer Fragen, welches SQL? MSSQL? MySQL? Postgre....

Unter MSSQL kannst du Rekursion nutzen (bzw. CTE als Stichwort), eingeleitet mit WITH. Beispiel:
WITH t AS (
SELECT KategoryID,KategoryParentID,Categorylvl
FROM tabelle
WHERE Kategorienummer=30506
UNION ALL
SELECT t.KategoryID,tabelle.KategoryParentID,tabelle.Categorylvl
FROM t
INNER JOIN tabelle
ON t.KategoryParentID = tabelle.KategoryID
AND t.Categorylvl = tabelle.Categorylvl - 1
)
SELECT *
FROM t
WHERE t.Categorylvl = 1
Member: BlueEyePhoenix
BlueEyePhoenix Aug 31, 2021 at 11:59:32 (UTC)
Goto Top
Ich nutze MSSQL und bin schwer am lernen damit ich das so alles auch verstehe was ich mache.


Zitat von @HubertvonUW:

Hi,
dein Problem ist nicht ganz klar.
In welchem Zusammenhang steht die KategorieID 500 zur KategoryID 200?
Du willst ja zum Objekt 1 mit KatID 500 die Werte der KatID 200.

lg

Ich möchte auf die Kategorie mit dem Lvl 1 verweisen das heißt beim objekt ist die 500 hinterlegt aber die 200 soll mir am ende ausgegeben werden.
Member: ukulele-7
ukulele-7 Aug 31, 2021 updated at 12:53:49 (UTC)
Goto Top
Sry bei mir war ein Fehler drin:
WITH  t AS (
SELECT KategoryID,KategoryParentID,Categorylvl
FROM tabelle
WHERE KategoryID=500 --Kategorienummer=30506???
UNION ALL
SELECT t.KategoryID,tabelle.KategoryParentID,tabelle.Categorylvl
FROM t
INNER JOIN tabelle
ON t.KategoryParentID = tabelle.KategoryID
AND t.Categorylvl - 1 = tabelle.Categorylvl
)
SELECT *
FROM t
WHERE t.Categorylvl = 1
Was es mit Kategorienummer=30506 auf sich hat erklärst du nicht, in deinen Beispieldaten hast du den Datensatz mit KategoryID=500 und möchtest auf den Datensatz mit KategoryID=200 schließen, das klappt mit der Abfrage.

Für weiteres Verständnis sieht das hier gut aus:
https://medium.com/swlh/recursion-in-sql-explained-graphically-679f6a0f1 ...
Member: HubertvonUW
HubertvonUW Sep 02, 2021 at 09:27:53 (UTC)
Goto Top
Hi, ganz hast du die Abhängigkeit der KatID 500 zu KatID200 nicht erklärt. face-smile

Wenn nur der "kleinste" Wert der Tabelle Kategorien angezeigt werden soll, dann ganz simpel

Select *
From (Select VB = 1, * from Objekttabelle) obj
Join (Select VB = 1, a.LVL, b.KatID, b.KatParentID
from (Select LVL = Min(LVL) from Kategorien) a
join (Select LVL, KatID, KatParentID from Kategorien b on a.LVL = b.LVL
) kat
on obj.VB = kat.VB

Damit bekommst zu zu jedem Objekt den kleinsten LVL mit den dazugehörigen KatID und ParentID

lg
Member: ukulele-7
ukulele-7 Sep 03, 2021 at 09:16:14 (UTC)
Goto Top
Zitat von @HubertvonUW:

Hi, ganz hast du die Abhängigkeit der KatID 500 zu KatID200 nicht erklärt. face-smile
Ist doch eigentlich offensichtlich:
KategoryID KategoryParentID Categorylvl
500 300 3
300 200 2
200 200 1
200 ist die höchste Ebene, dann kommt 300 unter 200 und 500 unter 300, also zwei Unterbenen in den Beispieldatensätzen. Ein ganz schlichtes, hierachisches Modell.
Select *
From (Select VB = 1, * from Objekttabelle) obj
Join (Select VB = 1, a.LVL, b.KatID, b.KatParentID
from (Select LVL = Min(LVL) from Kategorien) a
join (Select LVL, KatID, KatParentID from Kategorien b on a.LVL = b.LVL
) kat
on obj.VB = kat.VB
Ich weiß beim besten Willen nicht was das tun soll (schmeißt auch einen Syntaxfehler) aber das ist nicht rekursiv und daher für hierarchische Modelle wohl ungeeignet.