Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Mehrfach verschachtelte Subquery's - Referenz

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von FragendER, 17 April 2012.

  1. FragendER

    FragendER Neuer Benutzer

    Hallo zusammen,

    ich brauche einen kleinen Denkanstoß bei folgendem Problem:

    Aus einer Tabelle werden Organisationseinheiten [OE] mittels diesem Statement ausgelesen:


    Code:
    SELECT k.OE_ID,k.OE_Titel,k.Ebene,k.links,k.rechts,
     
    (SELECT Count(ID) FROM NestedSchema as s WHERE s.links > k.links AND  s.rechts < k.rechts) as Kinder,
     
    (SELECT Count(ID) FROM NestedSchema as s WHERE s.links > k.links AND  s.rechts < k.rechts AND s.Ebene = k.Ebene +1) as direkteKinder
     
     
     
    FROM NestedSchema AS k
     
    WHERE k.links > 1 AND k.rechts < 32
    Die beiden Subselects berechnen die Anzahl aller untergeordneten OE sowie aller direkten Nachkommen.
    Das Ergebnis sieht so aus:

    [​IMG]
    Mit einer weiteren Abfrage lässt sich zu jeder OE die untergeordnete Ebene bestimmen die am meisten OE enthält und diese ausgeben

    Code:
     SELECT OE_auf_BuEbene
      FROM(
          -- Ebene und Anzahl der OE auf dieser
          SELECT Ebene,Count(OE_ID) as OE_auf_BuEbene
          FROM(
             
            -- alle untergeordneten OE zur aktuellen OE
            SELECT n.OE_ID,n.OE_Titel,n.Ebene,n.links,n.rechts
     
            FROM NestedSchema AS n
             
            WHERE n.links > 1 AND n.rechts < 32
             
     
          ) as Liste
     
          GROUP BY Ebene
         
      )as Liste1
     
      WHERE OE_auf_BuEbene = (
          -- Maximum aus der Tabelle der Ebenen und ihrer OE Anzahl
          SELECT Max(OE_auf_BuEbene)
         
          FROM(
         
            SELECT Ebene,Count(OE_ID) as OE_auf_BuEbene
             
            FROM(
     
                SELECT n.OE_ID,n.OE_Titel,n.Ebene,n.links,n.rechts
     
                FROM NestedSchema AS n
               
                WHERE n.links > 1 AND n.rechts < 32
     
            ) as Liste
     
            GROUP BY Ebene
             
          )as Liste1
      )
    Ergebnis:

    [​IMG]

    Beide Abfragen für sich funktionieren - jedoch hätte ich das Ganze lieber in einer Abfrage erledigt so dass so etwas herauskommt:

    [​IMG]
    Nur sollte in der letzen Spalte nicht immer 8 stehen da dies das Ergebnis für die erste OE in der Liste ist.

    Ich habe probiert meine zweite Abfrage als weitere - also dritte - Subquery in die erste Abfrage zu hängen und dann die Bedingung

    Code:
    WHERE n.links > 1 AND n.rechts < 32
    durch
    Code:
    WHERE n.links > k.links AND n.rechts < k.rechts

    zu ersetzen damit er für jeden Datensatz der äußeren Abfrage die Unterabfrage mit den entsprechenden Grenzen des Datensatz ausführt.

    Jedoch bekomme ich immer ein "Unknown column k.links" zurück.

    Es scheint so als ob die Referenz auf das äußerste links durch mehrfaches verschachteln nicht mehr funktioniert.

    Muss man dieses irgendwie durchschleifen damit es klappt - oder ist dies prinzipiell unmöglich?

    Viele Grüße!

    PS: Ich hoffe ich habe mein Anliegen verständlich rüber bringen können. Ich bessere hier gerne nach falls das hilft.
     
  2. ukulele

    ukulele Datenbank-Guru

    Das ist exakt der selbe Fehler den ich auch vorgestern hatte http://www.datenbankforum.com/threads/mehrteilige-bezeichner-konnte-nicht-gebunden-werden.602/

    Du kannst zwar in Subquerrys im SELECT Teil dich auf eine andere Tabelle im "Master" Query beziehen, das geht aber leider nicht im FROM Teil. Ich habe es dann aber durch umstellen hin bekommen, was auch fast immer möglich sein dürfte. Einzig das GROUP BY ist immer irgendwie nervig.

    Leider blicke ich jetzt durch die Tabellen nicht so gut durch wie du, daher solltest du erstmal das umstellen versuchen. Bei mir hat es auch zusätzlich Geschwindigkeit bei weniger Zeilen gebracht :)
     
  3. ukulele

    ukulele Datenbank-Guru

    Leider scheinen sich auch 2 Tabellen im FROM Teil nicht per JOIN verbinden, jedenfalls klappt das bei mir nicht.
     
  4. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Bin mir nicht sicher ob das hier funkt:

    SELECT k.OE_ID,k.OE_Titel,k.Ebene,k.links,k.rechts,

    (SELECT Count(ID) FROM NestedSchema as s WHERE s.links > k.links AND s.rechts < k.rechts) as Kinder,

    (SELECT Count(ID) FROM NestedSchema as s WHERE s.links > k.links AND s.rechts < k.rechts AND s.Ebene = k.Ebene +1) as direkteKinder,


    (
    SELECT OE_auf_BuEbene
    (
    FROM --TB1
    (

    SELECT Ebene, OE_auf_BuEbene
    FROM(
    -- Ebene und Anzahl der OE auf dieser
    SELECT Ebene,Count(OE_ID) as OE_auf_BuEbene
    FROM(
    -- alle untergeordneten OE zur aktuellen OE
    SELECT n.OE_ID,n.OE_Titel,n.Ebene,n.links,n.rechts
    FROM NestedSchema AS n
    WHERE n.links > 1 AND n.rechts < 32
    ) as Liste
    GROUP BY Ebene
    )as Liste1

    WHERE OE_auf_BuEbene = (
    -- Maximum aus der Tabelle der Ebenen und ihrer OE Anzahl
    SELECT Max(OE_auf_BuEbene)
    FROM(
    SELECT Ebene,Count(OE_ID) as OE_auf_BuEbene
    FROM(
    SELECT n.OE_ID,n.OE_Titel,n.Ebene,n.links,n.rechts
    FROM NestedSchema AS n
    WHERE n.links > 1 AND n.rechts < 32
    ) as Liste
    GROUP BY Ebene
    )as Liste1
    )

    ) tb1

    WHERE tb1.Ebene = k.Ebene

    ) as OE_auf_BuEbene



    FROM NestedSchema AS k
    WHERE k.links > 1 AND k.rechts < 32


    Ist aber sicher SEHR performancelastig!!!!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden