IsParent? Geht das mit einer Abfrage?
-
Wenn ich eine DB Tabelle hat die so aussieht (z.B. Filesystem)
PARENT ID | CHILD ID 01 | 02 02 | 03 03 | 04 03 | 05 05 | 06 02 | 07 07 | 08
Kann ich dann mit einer SQL Abfrage feststellen, ob ein Objekt parent vom anderen ist? Auch über mehrere Schritte z.B. 02 ist Parent von 04. Das es mit mehreren in einer Schleife geht ist mir klar, aber auch mit einer?
-
SELECT CHILD_ID FROM TABELLE WHERE PARENT_ID = 02
Jetzt bekommst du alle Childs.
Gewöhne dir an keine Leerzeichen in Spaltennamen zu schreiben.
Ich schreibe Spaltennamen auch immer klein weil ich dann im SQLQUERY den SQLSYNTAX groß schreibe und so auf den ersten Blick sehe was Syntax und was Namen sind.
-
Unix-Tom schrieb:
SELECT CHILD_ID FROM TABELLE WHERE PARENT_ID = 02
Damit bekomme ich 03 und 07, aber nicht 04. Ich will ja wissen, ob eine Element auch über mehrere Stufen Parent ist.
Wenn du es dir als Baum vorstellst sieht es so aus.01 |--02 |--03 | |--04 | |--05 | |--06 |--07 |--08
Ich will also ob ein Element sich irgendwo im gesamten Unterast gefindet.
-
Im Grunde willst Du alle Stufen nach oben klappen, um diese auswerten zu können. Dafür habe ich mal folgende Funktion gebastelt. Geht im speziellen Fall zwar um eine BGR-Auflösung, ist prizipiell aber identisch angelegt.
SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE FUNCTION BGR.FN_BGAUFLOESUNG (@sBaugruppe varchar(25), @nMenge decimal(12,2)) RETURNS @retBG TABLE ( rowid int, artikel varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AS, stufe int, posliste int, menge decimal(12,2), ordernr int, kummenge decimal(12,2)) AS BEGIN DECLARE @RowsAdded int DECLARE @nStufe int Set @nStufe = 0 -- table variable to hold accumulated results DECLARE @Artikel TABLE ( artikel varchar(25) COLLATE SQL_Latin1_General_CP1_CI_AS, stufe int, posliste int, processed tinyint default 0, menge decimal(12,2), rowid int IDENTITY (1, 1) NOT NULL, ordernr int, kummenge decimal(12,2)) INSERT @Artikel (artikel, stufe, posliste, menge, ordernr, kummenge, processed) SELECT a.artikel, 0, IsNull(a.posliste, 0), @nMenge, 0, @nMenge, 2 FROM BGR.artikel a WHERE a.artikel = @sBaugruppe Set @nStufe = @nStufe + 1 INSERT @Artikel (artikel, stufe, posliste, menge, ordernr, kummenge) SELECT ap.artikel, @nStufe, IsNull(a.posliste, 0), ap.menge, ap.ordernr, ap.menge * @nMenge FROM BGR.artikelpos ap JOIN BGR.artikel a on ap.artikel = a.artikel WHERE ap.baugruppe = @sBaugruppe SET @RowsAdded = @@rowcount -- solange neue Sätze hinzugefügt werden WHILE @RowsAdded > 0 BEGIN Set @nStufe = @nStufe + 1 -- alle aufgelösten markieren UPDATE @Artikel SET processed = 1 WHERE processed = 0 -- mit "1" markierte auflösen INSERT @Artikel (artikel, stufe, posliste, menge, ordernr, kummenge) SELECT ap.artikel, @nStufe, IsNull(a.posliste, 0), ap.menge, bga.ordernr, ap.menge * bga.kummenge FROM BGR.artikelpos ap JOIN BGR.artikel a on ap.artikel = a.artikel JOIN @Artikel bga on ap.baugruppe = bga.artikel WHERE bga.processed = 1 and bga.posliste = 1 SET @RowsAdded = @@rowcount UPDATE @Artikel SET processed = 2 WHERE processed = 1 END -- copy to the result of the function the required columns INSERT @retBG SELECT rowid, artikel, stufe, posliste, menge, ordernr, kummenge FROM @Artikel ORDER BY ROWID RETURN END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
-
Das sind dann aber doch wieder mehrere Select Aufrufe. Und eigentlich will ich ja nicht bis ganz nach unten gehen, wenn ich schon festgestellt habe, dass ein Element Kind auf einer mittleren Stufe ist.
-
Genau lesn!
Das ist eine Funktion, die einmal gebaut wird und dann in einem Select abgefragt wird.
Und ja, Du schaust bis ganz runter. Es war ja nur ein Bsp., daß Du Deinen Bedürfnissen anpassen kannst.