Freigeben über


Vorgehensweise: Erstellen von Abfragen mit anderen Quellen als einer Tabelle (Visual Database Tools)

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 einem 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 ein JOIN-Vorgang eingebunden werden. Sie können z. B. die Verkäufe an teuren Büchern ermitteln, indem 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 dazu, wie Sie einer Abfrage eine Ansicht hinzufügen, finden Sie unter Vorgehensweise: Hinzufügen von Tabellen zu Abfragen (Visual Database Tools).

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 zu Aliasen finden Sie unter Vorgehensweise: Erstellen von Tabellenaliasen (Visual Database Tools) und unter Vorgehensweise: Erstellen von Spaltenaliasen (Visual Database Tools).

In ähnlicher Weise kann eine Abfrage in ein JOIN-Vorgang 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 dazu, wie Sie einer Abfrage eine Abfrage hinzufügen, finden Sie unter Vorgehensweise: Hinzufügen von Tabellen zu Abfragen (Visual Database Tools).

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 zum Ausführen 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 zum Hinzufügen einer benutzerdefinierten Funktion zu einer Abfrage finden Sie unter Vorgehensweise: Hinzufügen von Tabellen zu Abfragen (Visual Database Tools). Eine vollständige Beschreibung der benutzerdefinierten Funktionen finden Sie unter Benutzerdefinierte Funktionen (Datenbankmodul).