La clause IN nécessite quelques explications spécifiques. Les deux formes syntaxiques de cette clause sont les suivantes :
SREL_attr_name.subq_WHERE_attr[.attr] IN ( value1 [, value2 [,…]] ) SREL_attr_name.[subq_SELECT_attr]LIST_name.subq_WHERE_attr IN (value1, [,value2 [,…]] )
Le côté gauche de la clause doit commencer par un attribut de type de SREL de la table étant interrogée, ce qui est représenté par SREL_attr_name. subq_WHERE_attr est un attribut de l'objet étranger, qui peut être lui-même un autre pointeur de SREL.
Par exemple, une requête concernant l'objet demande (cr) peut être codée comme suit :
category.sym IN (’Soft%’, ’Email’)
Cela se traduit par le pseudo-SQL suivant :
SELECT … FROM cr WHERE cr.category IN (SELECT persistent_id FROM pcat WHERE sym LIKE ’Soft%’ OR sym = ’Email’)
Dans la requête secondaire précédente, pcat correspond au nom de l’objet désigné par cr.category.
La deuxième forme de clause IN permet d'effectuer des recherches dans les listes BREL. Par exemple, pour rechercher toutes les demandes assignées à un analyste dans un groupe spécifique, la clause est la suivante :
assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’)
La première partie de la clause (assignee) est un pointeur SREL (clé étrangère) de l’objet cr vers l’objet cnt. Ensuite, l’attribut de l’objet cnt, group_list, équivaut à une liste d’objets cnt qui représentent des groupes auxquels un contact appartient. La dernière partie (group) constitue la première partie de la clause WHERE pour la requête secondaire IN. ’U’913B485771E1B347968E530276916387 représente la valeur de la clé étrangère correspondant à un groupe. Le renvoi de la requête secondaire est spécifié par [member]. Cela se traduit par l’instruction pseudo-SQL suivante :
SELECT … FROM cr WHERE cr.assignee IN (SELECT member from grpmem WHERE group = U’913B485771E1B347968E530276916387’)
Vous pouvez spécifier plusieurs clés étrangères afin de faire correspondre plusieurs objets en proposant une liste de catégories séparées par des virgules :
assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’, U’913B485771E1B347968E530276916300’)
Vous ne pouvez pas étendre cette notation par insertion de point à cette utilisation de la clause IN. Ainsi, l’exemple suivant n’est pas valide :
assignee.[member]group_list.group.last_name IN (’Account Center’)
IN permet, entre autres, d’éviter les produits cartésiens. Par exemple, la requête suivante entraîne un produit cartésien et est particulièrement inefficace :
assignee.last_name LIKE ’MIS%’ OR group.last_name LIKE ’MIS%’
IN permet de coder la requête comme suit :
assignee.last_name IN ’MIS%’ OR group.last_name IN ’MIS%’
Cette requête ne crée pas de produit cartésien ; elle ne crée aucune jointure.
Remarque : Les parenthèses qui encadrent normalement la liste de valeurs à droite de IN peuvent être omises si la liste ne contient qu'une valeur. De même, vous devez éviter des jointures en convertissant les requêtes, comme le montre l’exemple suivant :
assignee.last_name LIKE ’Smith’
converti en :
assignee = U’913B485771E1B347968E530276916387’
Vous évitez ainsi la jointure même si la requête perd un peu en clarté. En utilisant IN, la partition écrite ci-après présente autant de clarté que la première version, tout en ayant une efficacité égale à celle de la deuxième version :
assignee.last_name IN ’Smith’
Le mot clé NOT ne peut pas être utilisé avec la clause IN, par exemple dans NOT IN.
|
Copyright © 2013 CA.
Tous droits réservés.
|
|