Gewusst wie: Erstellen von Abfragen mit anderen Quellen als einer Tabelle
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