Wie kann ich zwischen zwei Knoten in einem Baum für alle Knoten Abfrage?
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.
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
)