Vorheriges Thema: Where-KlauselnNächstes Thema: Web-Service-Methoden


IN-Klausel

Die IN-Klausel bedarf einer besonderen Erklärung. Die zwei syntaktischen Formen sind:

SREL_attr_name.subq_WHERE_attr[.attr] IN ( value1 [, value2 [,…]] )
SREL_attr_name.[subq_SELECT_attr]LIST_name.subq_WHERE_attr IN (value1, [,value2 [,…]] )

Die linke Seite der Klausel muss mit einem SREL-Attribut der abzufragenden Tabelle beginnen, was durch SREL_attr_name dargestellt wird. subq_WHERE_attr ist ein Attribut des Fremdobjekts, bei dem es sich wiederum um einen SREL-Zeiger handeln kann.

Eine Abfrage z. B. im Anfrageobjekt ("cr") lässt sich folgendermaßen codieren:

category.sym IN ('Soft%', 'Email')

Dies führt zu folgendem Pseudo-SQL:

SELECT … FROM cr WHERE cr.category IN (SELECT persistent_id FROM pcat WHERE sym LIKE 'Soft%' OR sym = 'Email')

In der obigen Unterabfrage ist „pcat“ der Objektname, auf den durch „cr.category“ verwiesen wird.

Mit der zweiten Form der IN-Klausel können BREL-Listen durchsucht werden. Um beispielsweise alle Anfragen zu finden, die einem Analysten in einer bestimmten Gruppe zugeordnet sind, verwenden Sie folgende Klausel:

assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’)

Der erste Teil der Klausel, „assignee“, ist eine SREL (ein Fremdschlüssel) des „cr“-Objekts, das auf das „cnt“-Objekt verweist. „group_list“, ein Attribut des „cnt“-Objekts, ist eine Liste von „cnt“-Objekten, die die Gruppen wiedergibt, zu denen ein Kontakt gehört. Der letzte Teil, „group“, bildet den ersten Teil der Where-Klausel für die IN-Unterabfrage. „U '913B485771E1B347968E530276916387“ ist der mit group abzugleichende Fremdschlüsselwert. Die Rückgabe der Unterabfrage wird durch „[member]“ festgelegt. Dies führt zu folgender Pseudo-SQL-Anweisung:

SELECT … FROM cr WHERE cr.assignee IN (SELECT member from grpmem WHERE group = U’913B485771E1B347968E530276916387’)

Sie können mehrere Fremdschlüssel für den Abgleich mit mehreren Objekten in einer durch Kommas getrennten Liste angeben:

assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’, U’913B485771E1B347968E530276916300’)

Für diese Verwendungsweise der IN-Klausel können Sie die Punktnotation nicht erweitern. Folgendes Beispiel ist ungültig:

assignee.[member]group_list.group.last_name IN ('Account Center')

Ein Verwendungszweck von IN besteht in der Vermeidung kartesischer Produkte. Die folgende Abfrage z. B. führt zu einem kartesischen Produkt und ist äußerst ineffizient:

assignee.last_name LIKE ’MIS%’ OR group.last_name LIKE ’MIS%’

Bei Verwendung von IN lässt sich die Abfrage folgendermaßen codieren:

assignee.last_name IN ’MIS%’ OR group.last_name IN ’MIS%’

Diese Abfrage führt nicht zu einem kartesischen Produkt. Mit ihr wird vielmehr überhaupt kein Join erstellt.

Hinweis: Die Klammern, die normalerweise die Liste der Werte auf der rechten Seite von IN umschließen, können weggelassen werden, wenn nur ein Wert in der Liste vorhanden ist. Analog hierzu sollten Sie Joins durch Konvertieren von Abfragen vermeiden, wie im folgenden Beispiel gezeigt:

assignee.last_name LIKE ‘Schmidt’

in:

assignee = U’913B485771E1B347968E530276916387’

Somit werden Joins vermieden, es kommt aber auch zu einem Verlust an Klarheit. Durch Verwendung von IN kann die gleiche Aufteilung mit der Klarheit der ersten Version sowie nahezu der gleichen Effizienz wie die zweite Version wie folgt geschrieben werden:

assignee.last_name IN ‘Schmidt’

Das Schlüsselwort „NOT“ kann nicht zusammen mit „IN“ verwendet werden, wie z. B. bei „NOT IN“.