EXISTS
EXISTS, korrelierte Subselects
Nehmen wir an, Sie wollen Zeilen aus einer Tabelle TEST basierend auf einem sehr scharfen Filter z.B. einer user-id oder einem anderen Primärschlüssel selektieren. Sie wollen auch Ihre Suchkriterien Schritt für Schritt erweitern.
-
- SELECT * FROM TEST WHERE ID=3;
- SELECT * FROM TEST WHERE ID=3 OR ID=4;
- SELECT * FROM TEST WHERE ID IN ( 3,4,5,99,0 );
Wenn die Liste von IDs wächst, ist es meistens einfacher, die Liste aus einer Referenztabelle zu holen.
Wird dies mit Hilfe eines regulären Joins gemacht (wie im folgenden Beispiel), werden womöglich doppelte Einträge entstehen, wenn die Referenztabelle nicht eindeutige Werte beinhaltet:
-
- -- will yield duplicated rows if possible_id is not unique.
- SELECT
- TEST.*
- FROM
- TEST
- INNER JOIN
- TEST_REF
- ON
- TEST.ID = TEST_REF.POSSIBLE_ID;
Lösung: Subqueries
An dieser Stelle sind IN(SELECT) und EXISTS sehr nützlich:
-
- -- will not duplicate entries
- SELECT * FROM TEST
- WHERE ID IN (
- SELECT POSSIBLE_ID FROM TEST_REF
- );
- -- allows to match more than one column between the tables.
- SELECT * FROM TEST
- WHERE EXISTS (
- SELECT 1 FROM TEST_REF
- WHERE POSSIBLE_ID=TEST.ID
- );
Bitte beachten Sie, dass das innere SELECT einen Filter benutzt, der die Tabelle aus dem äußeren SELECT referenziert. Dies nennt man 'korrelierter subselect'.















