2 Stimmen

Zeilenweiser IN BETWEEN-Vergleich in einer einzigen SQL-Anweisung

Gegeben sind die folgenden Tabellen:

CREATE TABLE tree (
    id serial NOT NULL,
    name character varying NOT NULL,
    type integer,
    lft integer NOT NULL,
    rgt integer NOT NULL )

CREATE TABLE item (
    id serial NOT NULL,
    name character varying NOT NULL,
    tree_id integer
    CONSTRAINT fk_tree FOREIGN KEY (tree_id) REFERENCES tree (id) )

Rubriken lft y rgt auf dem Tisch tree werden mit Hilfe des Algorithmus MPTT (Modified Preorder Tree Traversal) aufgefüllt.

Ist es möglich, alle Elemente, die an Baumknoten mit type=x angehängt sind, und alle ihre Nachkommen in einer einzeln abfragen?

Normalerweise würde ich das in zwei separaten Abfragen wie dieser tun:

SELECT lft, rgt FROM tree WHERE type = x;
/* assume it returns two rows: ((10, 20), (27, 30)) */

SELECT item.id, item.name FROM item JOIN tree ON (tree_id = tree.id)
WHERE ((lft >= 10 AND rgt <= 20) OR (lft >= 27 AND rgt <= 30);

Der Punkt ist, dass ich nur eine einzige SQL-Anweisung ausführen kann (in einer PostgreSQL-Datenbank, wenn es wichtig ist). Können Sie dies mit einer Art von Subquery tun?

Danke für jeden Hinweis.

2voto

Quassnoi Punkte 396418
SELECT  item.*
FROM    tree tm
JOIN    tree tc
ON      tc.lft >= tm.lft
        AND tc.rgt <= tm.rgt
JOIN    item
ON      item.tree_id = tc.id
WHERE   tm.type = x

Vielleicht sollten Sie das Eltern-Kind-Modell in Betracht ziehen, das viel einfacher zu verwalten ist.

Siehe diese Artikel in meinem Blog zur Implementierung in PostgreSQL 8.3 und darunter:

und in PostgreSQL 8.4 :

0voto

Nun, wenn Sie Probleme mit dem Schreiben von Abfragen für eine bestimmte Datenstruktur haben, sollten Sie vielleicht eine andere Datenstruktur verwenden. Verschachtelte Mengen (wie Sie sie hier gezeigt haben) sehen cool aus, sind aber ein großes Problem beim Schreiben von Abfragen für sie.

Vielleicht könnten Sie etwas verwenden wie ce (Offenlegung: es ist ein Beitrag in meinem Blog).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X