A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  Sonderzeichen  sybase-tech-blog


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.