Ankündigung

Einklappen
Keine Ankündigung bisher.

Iterationen in SQL-Select-Abfragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Iterationen in SQL-Select-Abfragen

    Hallo!


    Gibt es eine Möglichkeit einigermaßen performant iterierte SQL-Abfragen durchzuführen?

    Konkret geht es um folgendes:
    Ich hab ne Tabelle in der die Taxonomie eines Content Management Systems gespeichert ist, die sieht etwa so aus (vereinfacht, ein paar Spalten fehlen):

    ID.......Name..........Parent
    1...Category One.....NULL
    2...Category Two.....NULL
    3 ....Subcat One.........1
    4 ....Subcat Two.........3

    Wie man sieht ist Category One eine "Hauptkategorie" ohne Parent, Subcat One eine Unterkategorie von Category One und Subcat Two wiederum eine Unterkategorie von Subcat One.

    Wie kann ich nun, wenn ich die ID von Subcat Two habe, die drei Einträge (also Subcat Two und ihre Parents) auslesen?
    Ich finde leider keine Lösung, das mit einer einzigen Abfrage zu tun... Überhaupt sind die einzigen Loop-Möglichkeiten in SQL, die ich gefunden habe, für Transact-SQL. Geht das irgendwie in einer Abfrage?


    Viele Grüße!

  • #2
    Kommt drauf an, was für eine Datenbank Du hast. Manche können rekursive Abfragen, aber nicht alle.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Mal als Demo:

      Code:
      test=*# select * from olduwai ;
       id |    name    | parent
      ----+------------+--------
        1 | cat one    |       
        2 | cat two    |       
        3 | subcat one |      1
        4 | subcat two |      3
      (4 Zeilen)
      
      test=*# with recursive tree as (
        select
          o.id
          , o.name
          , o.parent, o.name as path
        from olduwai o
        where parent is null
        union all
        select
          o.id
          , o.name
          , o.parent
          , tree.name || '->' || o.name
        from olduwai o
        inner join tree
          on o.parent=tree.id
      )
      select * from tree;
       id |    name    | parent |          path          
      ----+------------+--------+------------------------
        1 | cat one    |        | cat one
        2 | cat two    |        | cat two
        3 | subcat one |      1 | cat one->subcat one
        4 | subcat two |      3 | subcat one->subcat two
      (4 Zeilen)
      
      test=*# with recursive tree as (
        select
          o.id
          , o.name
          , o.parent
          , o.name as path
        from olduwai o
        where id = 4
        union all
        select
          o.id
          , o.name
          , o.parent
          , tree.name || '->' || o.name
        from olduwai o
        inner join tree
        on o.id=tree.parent
      )
      select * from tree;
       id |    name    | parent |          path          
      ----+------------+--------+------------------------
        4 | subcat two |      3 | subcat two
        3 | subcat one |      1 | subcat two->subcat one
        1 | cat one    |        | subcat one->cat one
      (3 Zeilen)
      
      test=*#

      PostgreSQL seit Version 8.4, also seit Juli 2009.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar

      Lädt...
      X