Gewusst wie: Erstellen von Abfragen mit anderen Quellen als einer Tabelle

Aktualisiert: November 2007

Wenn Sie eine Abrufabfrage erstellen, geben Sie die aufzunehmenden Spalten und Zeilen sowie den Ort an, von dem der Abfrageprozessor die Ausgangsdaten abrufen kann. Üblicherweise handelt es sich bei diesen Ausgangsdaten um eine Tabelle oder mehrere verknüpfte Tabellen. Die zugrunde liegenden Daten können jedoch auch aus anderen Quellen stammen. Dies können Ansichten, Abfragen, Synonyme oder benutzerdefinierte Funktionen sein, die eine Tabelle zurückgeben.

Verwenden einer Ansicht anstelle einer Tabelle

Sie können Zeilen aus einer Ansicht auswählen. Nehmen Sie z. B. an, dass die Datenbank eine Ansicht mit der Bezeichnung ExpensiveBooks enthält, in der jede Zeile einen Titel mit einen Preis über 19,99 beschreibt. Die Definition der Ansicht kann folgendermaßen lauten:

SELECT *
FROM titles
WHERE price > 19.99

Sie können alle teuren Titel zum Thema Psychologie auswählen, indem Sie einfach alle Psychologiebücher aus der Ansicht ExpensiveBooks abrufen. Hierfür kann folgende SQL-Anweisung formuliert werden:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

In ähnlicher Weise kann eine Ansicht in eine JOIN-Operation eingebunden werden. Sie können z. B. die Verkäufe an teuren Büchern ermitteln, in dem Sie die Tabelle der Verkäufe mit der Ansicht ExpensiveBooks verknüpfen. Hierfür kann folgende SQL-Anweisung formuliert werden:

SELECT *
FROM sales 
         INNER JOIN 
         ExpensiveBooks 
         ON sales.title_id 
         =  ExpensiveBooks.title_id

Weitere Informationen darüber, wie Sie einer Abfrage eine Ansicht hinzufügen, finden Sie unter Gewusst wie: Hinzufügen von Tabellen zu Abfragen.

Verwenden einer Abfrage anstelle einer Tabelle

Sie können Zeilen aus einer Abfrage auswählen. Nehmen Sie z. B. an, dass Sie bereits eine Abfrage erstellt haben, die die Titel und IDs für Bücher zurückgibt, für die ein Mitautor angegeben ist, also alle Bücher mit mehreren Autoren. Hierfür kann folgende SQL-Anweisung formuliert werden:

SELECT 
     titles.title_id, title, type
FROM 
     titleauthor 
         INNER JOIN
         titles 
         ON titleauthor.title_id 
         =  titles.title_id 
GROUP BY 
     titles.title_id, title, type
HAVING COUNT(*) > 1

Sie können nun eine weitere Abfrage erstellen, die auf diesem Ergebnis aufbaut. Dies kann z. B. eine Abfrage sein, die alle Psychologiebücher ermittelt, die von mehreren Autoren geschrieben wurden. In dieser Abfrage können Sie die bereits vorhandene Abfrage als Quelle für die neuen Abfragedaten verwenden. Hierfür kann folgende SQL-Anweisung formuliert werden:

SELECT 
    title
FROM 
    (
    SELECT 
        titles.title_id, 
        title, 
        type
    FROM 
        titleauthor 
            INNER JOIN
            titles 
            ON titleauthor.title_id 
            =  titles.title_id 
    GROUP BY 
        titles.title_id, 
        title, 
        type
    HAVING COUNT(*) > 1
    ) 
    co_authored_books
WHERE     type = 'psychology'

Der hervorgehobene Text zeigt die vorhandene Abfrage, die die Ausgangsdaten für die neue Abfrage liefert. Beachten Sie, dass in der neuen Abfrage ein Alias (co_authored_books) für die vorhandene Abfrage verwendet wird. Weitere Informationen über Aliase finden Sie unter Gewusst wie: Erstellen von Tabellenaliasen und unter Gewusst wie: Erstellen von Spaltenaliasen.

In ähnlicher Weise kann eine Abfrage in eine JOIN-Operation eingebunden werden. Sie können z. B. die Verkäufe an teuren Büchern mit Mitautorenschaft ermitteln, indem Sie die Ansicht ExpensiveBooks mit der Abfrage verknüpfen, die die Bücher mit mehreren Autoren zurückgibt. Hierfür kann folgende SQL-Anweisung formuliert werden:

SELECT 
    ExpensiveBooks.title
FROM 
    ExpensiveBooks 
        INNER JOIN
        (
        SELECT 
            titles.title_id, 
            title, 
            type
        FROM 
            titleauthor 
                INNER JOIN
                titles 
                ON titleauthor.title_id 
                =  titles.title_id 
        GROUP BY 
            titles.title_id, 
            title, 
            type
        HAVING COUNT(*) > 1
        )

Weitere Informationen darüber, wie Sie einer Abfrage eine Abfrage hinzufügen, finden Sie unter Gewusst wie: Hinzufügen von Tabellen zu Abfragen.

Verwenden einer benutzerdefinierten Funktion anstelle einer Tabelle

In SQL Server 2000 oder höher können Sie eine benutzerdefinierte Funktion erstellen, die eine Tabelle zurückgibt. Solche Funktionen eignen sich für den Entwurf komplexer oder prozeduraler Logiken.

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. Sie können eine benutzerdefinierte Funktion erstellen, die eine Tabelle mit jeweils einer Zeile für jeden Mitarbeiter zurückgibt, der innerhalb der Organisationshierarchie unter einem Manager mit der angegebenen Tätigkeitsstufe arbeitet. Die Funktion trägt die Bezeichnung fn_GetWholeTeam und ist so formuliert, dass eine Eingabevariable übergeben werden kann: die emp_id des Managers, dessen Team Sie abrufen möchten.

Sie können eine Abfrage erstellen, die die Funktion fn_GetWholeTeam als Datenquelle verwendet. Hierfür kann folgende SQL-Anweisung formuliert werden:

SELECT * 
FROM 
     fn_GetWholeTeam ('VPA30890F')

"VPA30890F" ist die emp_id des Managers, dessen Organisation abgerufen wird. Weitere Informationen über das Hinzufügen einer benutzerdefinierten Funktion zu einer Abfrage finden Sie unter Gewusst wie: Einschließen benutzerdefinierter Funktionen in Abfragen und unter Gewusst wie: Hinzufügen von Tabellen zu Abfragen. Eine vollständige Beschreibung benutzerdefinierter Funktionen finden Sie in der Dokumentation zu SQL Server.

Siehe auch

Weitere Ressourcen

Arbeiten mit gespeicherten Prozeduren und benutzerdefinierten Funktionen