La cláusula IN requiere una explicación específica. Las dos formas sintácticas son las siguientes:
SREL_attr_name.subq_WHERE_attr[.attr] IN ( value1 [, value2 [,…]] ) SREL_attr_name.[subq_SELECT_attr]LIST_name.subq_WHERE_attr IN (value1, [,value2 [,…]] )
La parte izquierda de la cláusula debe empezar por un atributo de tipo SREL de la tabla que se esté consultando, que se representa mediante SREL_attr_name. subq_WHERE_attr es un atributo del objeto externo, que puede ser otro puntero SREL.
Por ejemplo, una consulta sobre el objeto de solicitud ("cr") se puede codificar de la siguiente forma:
category.sym IN ("Soft%", "Email")
Esto se traduce en el siguiente pseudo-SQL:
SELECT … FROM cr WHERE cr.category IN (SELECT persistent_id FROM pcat WHERE sym LIKE "Soft%" OR sym = "Email")
En la subconsulta anterior, "pcat" es el nombre de objeto apuntado por cr.category.
La segunda forma de la cláusula IN puede buscar en listas BREL. Por ejemplo, la cláusula para buscar todas las solicitudes asignadas a un analista de un grupo específico es la siguiente:
assignee.[member]group_list.group IN (U"913B485771E1B347968E530276916387")
La primera parte de la cláusula, assignee, es una SREL (clave externa) del objeto cr que apunta al objeto cnt. A continuación, group_list, que es un atributo del objeto cnt, es una lista de objetos cnt que representa grupos a los que pertenece un contacto. La última parte, group, forma la primera parte de la cláusula Where para la subconsulta IN. "U"913B485771E1B347968E530276916387es el valor de clave externa para coincidir con el grupo. La devolución de la subconsulta se especifica mediante [member]. Esto se traduce en la siguiente pseudo-instrucción SQL:
SELECT … FROM cr WHERE cr.assignee IN (SELECT member from grpmem WHERE group = U"913B485771E1B347968E530276916387")
Puede especificar varias claves externas para coincidir con varios objetos mediante una lista separada por comas:
assignee.[member]group_list.group IN (U"913B485771E1B347968E530276916387", U"913B485771E1B347968E530276916300")
No puede ampliar la notación con puntos para este uso de la cláusula IN; por ejemplo, la siguiente no es válida:
assignee.[member]group_list.group.last_name IN ("Account Center")
Un uso de IN es evitar productos cartesianos. Por ejemplo, la consulta siguiente crea un producto cartesiano y es muy ineficaz:
assignee.last_name LIKE "MIS%" OR group.last_name LIKE "MIS%"
Con el uso de IN, la consulta se puede codificar de la siguiente forma:
assignee.last_name IN "MIS%" OR group.last_name IN "MIS%"
Esta consulta no crea un producto cartesiano; de hecho, no crea ninguna unión.
Nota: Se pueden omitir los paréntesis que normalmente encierran la lista de valores situados a la derecha de IN si sólo hay un valor en la lista. De manera similar, debe evitar las uniones mediante la conversión de consultas, como se muestra en el siguiente ejemplo:
assignee.last_name LIKE ‘Smith’
a:
assignee = U’913B485771E1B347968E530276916387’
Esto evita la unión y también pierde claridad. Con el uso de IN, se puede escribir la misma partición de la forma siguiente, conservando la claridad de la primera versión y casi la misma eficacia de la segunda:
assignee.last_name IN ‘Smith’
La palabra clave "NOT" no puede estar junto con IN; por ejemplo, “NOT IN”.
|
Copyright © 2013 CA.
Todos los derechos reservados.
|
|