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.


Anmelden zum Antworten