Freigeben über


Erstellen von Abfragen mit etwas anderem als einer Tabelle (Visuelle Datenbanktools)

Gilt für:SQL Server-

Immer wenn Sie eine Abrufabfrage schreiben, formulieren Sie, welche Spalten Sie benötigen, welche Zeilen Sie benötigen und wo der Abfrageprozessor die ursprünglichen Daten finden soll. In der Regel bestehen diese ursprünglichen Daten aus einer Tabelle oder mehreren Tabellen, die miteinander verbunden sind. Die ursprünglichen Daten können jedoch aus anderen Quellen als Tabellen stammen. Tatsächlich kann es aus Ansichten, Abfragen, Synonymen oder benutzerdefinierten Funktionen stammen, die eine Tabelle zurückgeben.

Verwenden einer Ansicht anstelle einer Tabelle

Sie können Zeilen aus einer Ansicht auswählen. Angenommen, die Datenbank enthält eine Ansicht namens "ExpensiveBooks", in der jede Zeile einen Titel beschreibt, dessen Preis 19,99 überschreitet. Die Ansichtsdefinition sieht möglicherweise wie folgt aus:

SELECT *  
FROM titles  
WHERE price > 19.99  

Sie können nur die teuren Psychologiebücher auswählen, indem Sie die Psychologiebücher aus der Ansicht "ExpensiveBooks" auswählen. Die resultierende SQL-Datei sieht möglicherweise wie folgt aus:

SELECT *  
FROM ExpensiveBooks  
WHERE type = 'psychology'  

Ebenso kann eine Ansicht an einer JOIN-Operation teilnehmen. So können Sie z. B. den Verkauf von teuren Büchern nur finden, indem Sie die Verkaufstabelle mit der Ansicht "ExpensiveBooks" verknüpfen. Die resultierende SQL-Datei sieht möglicherweise wie folgt aus:

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

Weitere Informationen zum Hinzufügen einer Ansicht zu einer Abfrage finden Sie unter Hinzufügen von Tabellen zu Abfragen (Visual Database Tools).

Verwenden einer Abfrage anstelle einer Tabelle

Sie können Zeilen aus einer Abfrage auswählen. Angenommen, Sie haben bereits eine Abfrage geschrieben, die Titel und Identifikatoren der gemeinsam verfassten Bücher abruft – die Bücher mit mehr als einem Autor. Sql sieht möglicherweise wie folgt aus:

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  

Anschließend können Sie eine weitere Abfrage schreiben, die auf diesem Ergebnis basiert. Sie können z. B. eine Abfrage schreiben, die die gemeinsam verfassten Psychologiebücher abruft. Zum Schreiben dieser neuen Abfrage können Sie die vorhandene Abfrage als Quelle der Daten der neuen Abfrage verwenden. Die resultierende SQL-Datei sieht möglicherweise wie folgt aus:

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 als Quelle der Daten der neuen Abfrage verwendet wird. Beachten Sie, dass die neue Abfrage einen Alias ("co_authored_books") für die vorhandene Abfrage verwendet. Weitere Informationen zu Aliasen finden Sie unter Erstellen von Tabellenaliasen (Visual Database Tools) und Erstellen von Spaltenaliasen (Visual Database Tools).

Ebenso kann eine Abfrage an einer JOIN-Operation teilnehmen. Beispielsweise können Sie den Verkauf teurer mitverfasster Bücher ermitteln, indem Sie die Ansicht "ExpensiveBooks" mit der Abfrage verbinden, die die mitverfassten Bücher abruft. Die resultierende SQL-Datei sieht möglicherweise wie folgt aus:

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 zum Hinzufügen einer Abfrage zu einer Abfrage finden Sie unter Hinzufügen von Tabellen zu Abfragen (Visual Database Tools).

Verwenden einer User-Defined-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 sind nützlich, um komplexe oder prozedurale Logik auszuführen.

Angenommen, die Mitarbeitertabelle enthält eine zusätzliche Spalte, employee.manager_emp_id und dass ein Fremdschlüssel zwischen manager_emp_id und employee.emp_id vorhanden ist. In jeder Zeile der Mitarbeitertabelle gibt die spalte manager_emp_id den Vorgesetzten des Mitarbeiters an. Genauer gesagt, zeigt es die emp_id des Vorgesetzten des Mitarbeiters an. Sie können eine benutzerdefinierte Funktion erstellen, die eine Tabelle zurückgibt, die eine Zeile für jeden Mitarbeiter enthält, der in der Organisationshierarchie einer bestimmten obersten Ebene arbeitet. Möglicherweise rufen Sie die Funktion fn_GetWholeTeam auf, und entwerfen Sie sie so, dass eine Eingabevariable verwendet wird – die emp_id des Vorgesetzten, dessen Team Sie abrufen möchten.

Sie können eine Abfrage schreiben, die die funktion fn_GetWholeTeam als Datenquelle verwendet. Die resultierende SQL-Datei sieht möglicherweise wie folgt aus:

SELECT *   
FROM   
     fn_GetWholeTeam ('VPA30890F')  

"VPA30890F" ist die emp_id des Managers, dessen Organisation Sie abrufen möchten. Weitere Informationen zum Hinzufügen einer benutzerdefinierten Funktion zu einer Abfrage finden Sie unter Hinzufügen von Tabellen zu Abfragen (Visual Database Tools). Eine vollständige Beschreibung der benutzerdefinierten Funktionen finden Sie unter User-Defined Funktionen.