Mehrfach verschachtelte Subquery's - Referenz

FragendER

Neuer Benutzer
Beiträge
1
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:


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:

ntlv48r8gbz.png


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

qo1ikarsps1.png

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.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.647
Das ist exakt der selbe Fehler den ich auch vorgestern hatte https://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 :)
 

ukulele

Datenbank-Guru
Beiträge
4.647
Leider scheinen sich auch 2 Tabellen im FROM Teil nicht per JOIN verbinden, jedenfalls klappt das bei mir nicht.
 
Werbung:

PLSQL_SQL

SQL-Guru
Beiträge
176
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!!!!
 
Oben