Frage

ich eine hierarchische Datenbank strucutre haben, z.B. Spalten ID und PARENT_ID für jede Reihe definiert ist, mit der obersten Ebene eine Reihe NULL PARENT_ID hat.

Ich habe alle Beziehungen aus dieser Tabelle in einer anderen Tabelle abgeflacht, z.B. wenn es in einer einzigen Hierarchie der Großeltern drei Datensätze sind, Eltern, Enkel, gäbe es 3 Datensätze sein:

**ANCESTOR, DESCENDANT**
grantparent, parent
grandparent, grandchild
parent, grandchild

als vielmehr eine hierarchische Abfrage ausführen, um festzustellen, dass der Enkel ein Nachkomme der Großeltern ist, kann ich einfach für die Existenz eines (grandparent, grandchild) Datensatz in dieser abgeflachte Tabelle überprüfen.

Meine Frage ist, diese abgeflachte Tabelle, wie kann ich am effizientesten alle Datensätze zurück, die zwischen zwei Knoten sind. Am Beispiel mit grandparent und grandchild als meine Parametern, wie kann ich den (grandparent, parent) Datensatz zurück.

Ich will nicht eine hierarchische Abfrage verwenden, um diese zu lösen ... Ich frage mich, ob es möglich ist, dies zu tun, ohne dass beitritt.

War es hilfreich?

Lösung

SELECT  *
FROM    mytable
WHERE   descendant = @descendant
        AND hops < 
        (
        SELECT  hops
        FROM    mytable
        WHERE   descendant = @descendant
                AND ancestor = @ancestor
        )

Dies wird automatisch kümmern Fällen, wenn @ancestor nicht wirklich ein Vorfahren @descendant ist.

Erstellen Sie einen Index auf (descendant, hops) für diese Arbeit schnell.

Andere Tipps

Versuchen Sie:

select h1.descendant intermediate_node
from hierarchy h0 
join hierarchy h1 
  on h0.ancestor = h1.ancestor 
 and h0.hops > h1.hops  -- redundant condition, but may improve performance
join hierarchy h2
  on h1.ancestor = h2.ancestor 
 and h0.descendant = h2.descendant
where h0.ancestor = :ancestor and h0.descendant = :descendant
SELECT
   distinct ancestor 
FROM 
   hierarchy 
WHERE descendant = :1 AND 
      ancestor IN (
                    SELECT 
                       distinct descendant 
                    FROM 
                       hierarchy WHERE ancestor = :2
                  )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top