Vinzenz Mai: Kann ich statt eines JOIN einen zweiten Satz bekommen?

Beitrag lesen

Hallo,

Es handelt sich um einen Monster-Select, der jetzt schon acht JOINS hat. Da wird der Ort dazugeholt, verwendete Sprachen und Übersetzungstabellen. Ich versuche, das Teilproblem herauszulösen:

id    name            ort_id  ueber_id


0815  Aldi-Zentrale   13556   NULL
4711  Aldi Frankfurt  17342   0815
4712  Mustermann      16344   NULL

das sieht nach einer hierarchischen Beziehung aus. Hierarchische Beziehungen bereiten in relationalen Datenbanken durchaus Bauchgrimmen :-)

Wenn es nur zwei Ebenen gibt, dann könntest Du den zweiten Datensatz per Selfjoin bekommen. Wie ich im Dir bereits bekannten Artikel schreibe, skalieren Selfjoins nicht besonders gut:

Idee 1:

SELECT  
    id,  
    name,  
    ort_id,  
    ueber_id  
FROM  
    tabelle  
WHERE  
    id = 4711  

liefert Dir die Aldi-Filiale in Frankfurt

Der Selfjoin:

SELECT  
    t1.id,  
    t1.name,  
    t1.ort_id,  
    t1.ueber_id  
FROM  
    tabelle t1  
INNER JOIN  
    tabelle t2  
ON  
    t1.id = t2.ueber_id  
WHERE  
    t2.id = 4711

liefert Dir die zugehörige Aldi-Zentrale zur Filiale in Frankfurt.

Die UNION beider Abfragen liefert Dir die beiden gewünschten Datensätze:

SELECT  
    id,  
    name,  
    ort_id,  
    ueber_id  
FROM  
    tabelle  
WHERE  
    id = 4711  
  
UNION ALL  
  
SELECT  
    t1.id,  
    t1.name,  
    t1.ort_id,  
    t1.ueber_id  
FROM  
    tabelle t1  
INNER JOIN  
    tabelle t2  
ON  
    t1.id = t2.ueber_id  
WHERE  
    t2.id = 4711  

liefert die beiden gewünschten Datensätze

Alternativ könntest Du mit einer Subquery arbeiten:

SELECT          -- Gib mir  
    id,         -- den Datensatz  
    name,  
    ort_id,  
    ueber_id  
FROM  
    tabelle  
WHERE  
    id = 4711   -- bei dem die id 4711 ist  
OR                          -- oder deren  
    id IN (                 -- id in der  
        SELECT              -- Liste der  
            t2.ueber_id     -- Werte der ueber_ids  
        FROM                -- aus  
            tabelle t2      -- der gleichen Tabelle enthalten ist  
        WHERE               -- wobei nur die Datensätze betrachtet werden  
            t2.id = 4711    -- deren id-Wert 4711 ist  
    )  

Sobald Du mehr als zwei Ebenen betrachten musst, dann solltest Du Dein Konzept der einfachen Adjazenzliste überdenken. Vielleicht käme das Nested-Set-Modell in Frage, vielleicht auch der Closure-Tree.

Das hängt durchaus von Deinen Daten und den typischen Operationen auf diesen Daten ab.

Freundliche Grüße

Vinzenz