Zweifaches Verwenden einer Tabelle in einer Abfrage

Aktualisiert: November 2007

Sie können dieselbe Tabelle mehrmals innerhalb einer Abfrage verwenden. Dies kann in verschiedenen Situationen notwendig sein.

  • Erstellen einer Selbstverknüpfung mit einer reflexiven Beziehung   Sie können eine Tabelle über eine reflexive Verknüpfung mit sich selbst verknüpfen. Bei dieser Beziehung befinden sich die verweisenden Fremdschlüsselspalten und die Fremdschlüsselspalten, auf die verwiesen wird, in derselben Tabelle. Nehmen Sie beispielsweise an, dass die Tabelle der Mitarbeiter eine zusätzliche Spalte employee.manager_emp_id enthält und dass eine Fremdschlüsselbeziehung zwischen manager_emp_id und employee.emp_id vorliegt. Innerhalb jeder Zeile der Tabelle der Mitarbeiter gibt die Spalte manager_emp_id den Vorgesetzten des Mitarbeiters an. Genauer gesagt, die emp_id des Vorgesetzten des Mitarbeiters wird angezeigt.

    Durch das Verknüpfen der Tabelle mit sich selbst über eine reflexive Beziehung können Sie ein Resultset erstellen, in dem jede Zeile den Namen eines Vorgesetzten und den Namen eines diesem Vorgesetzten unterstellten Mitarbeiters angibt. Hierfür kann folgende SQL-Anweisung formuliert werden:

    SELECT 
        boss.lname, 
        boss.fname, 
        employee.lname, 
        employee.fname
    FROM 
        employee
            INNER JOIN 
            employee boss 
            ON employee.manager_emp_id 
            =  boss.emp_id
    

    Weitere Informationen über das Erstellen von Verknüpfungen mithilfe reflexiver Beziehungen finden Sie unter Gewusst wie: Automatisches Erstellen von Selbstverknüpfungen.

  • Erstellen einer Selbstverknüpfung ohne reflexive Beziehung   Sie können eine Tabelle mit sich selbst verknüpfen, ohne eine reflexive Beziehung zu verwenden. Sie können beispielsweise ein Resultset erstellen, in dem jede Zeile einen Mitarbeiter und einen potenziellen Mentor für diesen Mitarbeiter beschreibt. (Ein potenzieller Mentor ist ein Mitarbeiter mit einer höheren Tätigkeitsstufe.) Hierfür kann folgende SQL-Anweisung formuliert werden:

    SELECT 
        employee.fname, 
        employee.lname, 
        mentor.fname, 
        mentor.lname 
    FROM 
        employee 
            INNER JOIN 
            employee mentor 
            ON employee.job_lvl 
            <  mentor.job_lvl
    

    Beachten Sie, dass in der Verknüpfung keine Gleichheitsbedingung verwendet wird. Weitere Informationen über das Verknüpfen von Tabellen mithilfe alternativer Bedingungen finden Sie unter Verknüpfen von Vergleichsoperatoren.

    Weitere Informationen über das Erstellen von Selbstverknüpfungen mithilfe nicht verknüpfter Spalten finden Sie unter Gewusst wie: Manuelles Erstellen von Selbstverknüpfungen.

  • Zweifaches Verwenden einer Tabelle ohne eine Selbstverknüpfung   Auch ohne eine Selbstverknüpfung ist es möglich, dieselbe Tabelle mehrmals in einer Abfrage zu verwenden. Sie können z. B. ein Resultset erstellen, das alle weiteren Buchtitel des Autors bzw. der Autoren Ihres Lieblingstitels enthält. In diesem Fall wird die Tabelle titleauthors zweimal abgefragt: zunächst, um die Autoren Ihres Lieblingsbuches zu ermitteln (Is Anger the Enemy?), und anschließend für eine Suche nach den anderen Büchern dieser Autoren. Hierfür kann folgende SQL-Anweisung formuliert werden:

    SELECT 
        other_title.title
    FROM 
        titles favorite_title 
            INNER JOIN 
            titleauthor favorite_titleauthor 
            ON favorite_title.title_id 
            =  favorite_titleauthor.title_id 
                INNER JOIN 
                authors 
                ON favorite_titleauthor.au_id 
                =  authors.au_id 
                    INNER JOIN 
                    titleauthor other_titleauthor 
                    ON authors.au_id 
                    =  other_titleauthor.au_id 
                        INNER JOIN 
                        titles other_title 
                        ON other_titleauthor.title_id 
                        =  other_title.title_id 
    WHERE 
        favorite_title.title 
        = 'Is Anger the Enemy?' 
      AND 
        favorite_title.title 
        <> other_title.title 
    
    Hinweis:

    Um zwischen den Verwendungen einer Tabelle zu unterscheiden, verwendet die vorherige Abfrage folgende Aliase: favorite_title, favorite_titleauthor, other_titleauthor und other_title. Weitere Informationen über Aliase finden Sie unter Gewusst wie: Erstellen von Tabellenaliasen.

Siehe auch

Konzepte

Arbeiten mit Daten im Ergebnisbereich

Weitere Ressourcen

Angeben von Suchkriterien