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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1213147637
Url: https://administrator.de/contentid/1213147637
Ausgedruckt am: 20.11.2024 um 02:11 Uhr
7 Kommentare
Neuester Kommentar
Ich muss das immer Fragen, welches SQL? MSSQL? MySQL? Postgre....
Unter MSSQL kannst du Rekursion nutzen (bzw. CTE als Stichwort), eingeleitet mit WITH. Beispiel:
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
Sry bei mir war ein Fehler drin:
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 ...
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
Für weiteres Verständnis sieht das hier gut aus:
https://medium.com/swlh/recursion-in-sql-explained-graphically-679f6a0f1 ...
Hi, ganz hast du die Abhängigkeit der KatID 500 zu KatID200 nicht erklärt.
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
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
Ist doch eigentlich offensichtlich:
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.
KategoryID KategoryParentID Categorylvl
500 300 3
300 200 2
200 200 1
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.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