|
Kategorie: ASE: T-SQL: DQL
Subqueries, inner queries
Um komplexere Abfragen zu erstellen, kann es notwendig sein, in der Bedingung
Abfragen zu verschachteln. Verschachtelte Abfragen werden als
Subquery bezeichnet. Sie sind mit anderen Worten
Queries
innerhalb einer Query. Darum werden sie gelegentlich auch als inner queries
bezeichnet.
Select
Statements
die eine Subquery innerhalb einer anderen Subquery beinhalten
werden auch als
nested queries
oder nested select statements, also als verschalchtelte Abfragen bezeichnet.
Die Verschachtelungstiefe eines Statemants ist abhängig von der Version des
ASE Servers.
Version 12.5 erlaubt beispielsweise eine Verschachtelungstiefe von 16. Ab Version
15.0 können sogar 50 Subqueries inenander verschachtelt werden.
Subqueries: Einsatzmöglichkeiten
Im Allgemeinen werden Queries mittels
where
und
having
Bedingungen
so geschrieben, dass das Ausgabeergebnis entsprechend der Bedinung begrenzt wird. Gelegentlich
hängen die Ausgabeergebnisse von Informationen ab, die sich in anderen
Tabellen
befinden. Subqueries innerhalb der where oder having Bedingung werden also verwendet,
um eine Query zu formulieren, deren Ausgabe vom Ergebnisse einer anderer Abfragen anhängig ist.
Das gleiche Ergebenis könnte auch über einen
Join
erreicht werden. Subqueries sind aber im Algemeinem leichter zu schreiben als joins.
Allerdings ist die Anzahl der zurückgegebenen Spalten und Zeilen einer Subquery begrenzt.
Subqueries, die nur einen Rückgabewert haben dürfen darüber hinaus auch in der
select
und
from
Anweisung
sowie in den Bedinungen
exists,
in,
any
und
all
einer Query definiert werden. exists darf nur in einem
if
oder
while
Statement
verwendet werden. Inerhalb in, any und all dürfen die Subqueries sogar
mehrere Werte zurückgeben solange sie sich in einer Spalte befinden.
Subqueries in der where-Bedingung
select * from sysdevices
where id = (select id from sysdatabases where name = db_id("db_name"))
Subqueries in der having-Bedingung
In der having Bedingung wird eine Subquery benutzt um die Zeilenorganisation der
group by
Bedingung zu organisieren.
Subqueries in der exists-Bedingung
Eine Subquery in der exists-Bedinung darf nur in einem
if
oder
while
Statement
verwendet werden. Das Ergebnis der Subquery muss mindestens eine
Zeile enthalten, um
true
zurückzugeben.
Subqueries in der in-Bedingung
Inerhalb der in-Bedinung dürfen die Subqueries mehrere Werte zurückgeben,
solange sie sich in einer Spalte befinden. Das Ergebnis der Subquery muss mindestens eine
Zeile enthalten, um true zurückzugeben.
select * from sysprocesses
where suid in
(select suid from syslogins where name = 'user_name')
Mit dieser Subquery könnten Beispielsweise die Proszeees für einen bestimmten
User
(Benutzer) ausgegeben werden.
Subqueries in der all-Bedingung
Eine Subquery in der all-Bedinung wird immer nur mit den
logischen Operatoren
größer als (>)
oder
kleiner als (<)
verwendet. Alle Zeilen müssen der Bedinung entsprechen.
Subqueries in der any-Bedingung
Eine Subquery in der all-Bedinung wird immer nur mit den
logischen Operatoren
gleich =,
nicht gleich <>,
kleiner <,
kliener gleich <=,
größer >,
größer gleich >=
verwendet. Das Ergebnis der Subquery muss mindestens eine
Zeile enthalten, um true zurückzugeben.
Subquery: Typen
Es gibt zwei verschiedene Typen von Subqueries.
Expression subqueries
und
Quantified predicate subqueries.
Jeder der beiden Typen unterteilt sich dann wieder in die Typen
noncorrelated subqueries
or
correlated subqueries.
|