Auslesen eines Pfades per SELECT?



  • Dies ist mein erster Beitrag hier, also verzeiht mir mögliche Fehler.

    Also, ich schreibe gerade eine Datenbank-Library für Externe Medien (CD/DVD...) in C++ mit sqlite3. Mit der C++-Seite des Projekts komme ich gut klar, aber die SQL-Seite bereitet mir ein Problem, nämlich folgendes:

    Ordner und Files sind in der gleichen Tabelle in der aber keine Pfade gespeichert sind, sondern nur der Verweis auf den Vorgänger. Der root-Ordner hat dabei die ID 0, der nächste Ordner unter root die ID 1 mit ParentID 0, usw. So sieht das ganze aus:

    Die ID wird pro Datei einfach Inkrementiert, ParentId meint den Ordner in dem die jeweilige Datei sich befindet, Type der Dateityp wobei 0 = Ordner ist
    Alles unwichtige hab' ich weggelassen.

    ID - ParentID - Type - Filename - ...
    0 - 0 - 0 - Rootordner
    1 - 0 - 1 - File1
    2 - 0 - 1 - File2
    3 - 0 - 0 - Ordner1
    4 - 3 - 1 - File3
    5 - 3 - 1 - File4
    6 - 3 - 0 - Ordner2
    7 - 6 - 1 - File5
    ...
    

    Kennt jemand eine Möglichkeit mit einer SELECT-Anweisung den Pfad der Datei mit der ID 7 - File5 (RootOrdner/Ordner1/Ordner2/File5) zu ermitteln? Oder muss man das dann in C++ mit rekursiven/iterativen SELECT-Anweisungen coden?

    Hat jemand vielleicht eine ganz andere Idee, Pfade möglichst komprimiert zu speichern?



  • Verwende doch referenzierente Procedures. Als Beispiel so:

    ALTER PROCEDURE [dbo].[GetFilePathByID] 
    (
    	@ID int,
    	@Fullname nvarchar(500) Output
    )
    AS	SET NOCOUNT ON;
    
    BEGIN
    DECLARE @Name nvarchar(150);
    DECLARE @ParentID int;
    
    	IF ( @ID IS NOT NULL )
    		BEGIN
    			 SET @Name = (SELECT [Filename] FROM [Test] WHERE ID=@ID)
    
    			 SET @ParentID = (SELECT [ParentID] FROM [Test] WHERE ID=@ID)
    			 IF (@ParentID IS NOT NULL )
    				BEGIN
    					EXECUTE [dbo].[GetFilePathByID] @ParentID, @Fullname OUTPUT;
    					Set @Fullname = @Fullname + '/' + @Name
    
    				END
    			 ELSE
    				BEGIN
    					SET @Fullname = @Name
    				END			 
    		END	
    END
    

    Du musst natürlich Test noch auf dein Tabellenname abändern und die Variablen an deine Feld-Datentypen abpassen!

    Ab SQL Server 2005 kann man hierarische Daten direkt Verarbeiten, siehe CTE



  • Das scheint ja ein Schubs in die richtige Richtung zu sein. Meine Datenbank ist ja mit SQLite3 verwirklicht. ' weiß nicht ob das da so geht. Wohl eher nicht. Wenn es nicht funkt., wird es wohl mit reinem SQL und SQLite3 garnicht gehen. Aber es hilft auf jeden Fall beim Googlen.

    Vielen Dank auf jeden Fall.


Anmelden zum Antworten