IN 子句需要一些特殊说明。两种语法形式如下:
SREL_attr_name.subq_WHERE_attr[.attr] IN ( value1 [, value2 [,…]] ) SREL_attr_name.[subq_SELECT_attr]LIST_name.subq_WHERE_attr IN (value1, [,value2 [,…]] )
该子句的左侧部分必须以要查询的表的 SREL 类型属性(由 SREL_attr_name 表示)开头。subq_WHERE_attr 是外部对象的属性,该对象本身可能是另一个 SREL 指针。
例如,针对请求 (‘cr’) 对象的查询可以编码如下:
category.sym IN (’Soft%’, ’Email’)
这将转换为以下伪 SQL:
SELECT … FROM cr WHERE cr.category IN (SELECT persistent_id FROM pcat WHERE sym LIKE ‘Soft%’ OR sym = ‘Email’)
在上一子查询中,‘pcat’是通过 cr.category 指向的对象名。
IN 子句的第二种形式可以搜索 BREL 列表。例如,要查找分配至特定组中分析师的全部请求,子句如下:
assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’)
子句的第一部分 assignee 是 cr 对象的 SREL(外键),指向 cnt 对象。下一部分 group_list 是 cnt 对象的属性,是表示联系人所属组的 cnt 对象列表。最后一部分 group 构成 IN 子查询的 where 子句的第一部分。U’913B485771E1B347968E530276916387’ 是匹配组的外键值。子查询返回由 [member] 指定。这转换为以下伪 SQL 语句:
SELECT … FROM cr WHERE cr.assignee IN (SELECT member from grpmem WHERE group = U’913B485771E1B347968E530276916387’)
通过提供逗号分隔的列表,您可以指定多个外键以用于匹配多个对象:
assignee.[member]group_list.group IN (U’913B485771E1B347968E530276916387’, U’913B485771E1B347968E530276916300’)
您不能为了这样使用 IN 子句而扩展点标记,例如,以下内容无效:
assignee.[member]group_list.group.last_name IN (‘Account Center’)
使用 IN 子句的一个目的是为了避免产生笛卡尔乘积。例如,以下查询会导致产生笛卡尔乘积,因而效率极低:
assignee.last_name LIKE ’MIS%’ OR group.last_name LIKE ’MIS%’
使用 IN,查询可以编码如下:
assignee.last_name IN ’MIS%’ OR group.last_name IN ’MIS%’
此查询不会产生笛卡尔乘积;事实上它根本不会创建连接。
注意:如果列表中只有一个值,则可以省略通常将 IN 右侧的值列表括起来的圆括号。同样,您应该通过转换查询避免连接,如下例所示:
assignee.last_name LIKE ‘Smith’
变更为:
assignee = U’913B485771E1B347968E530276916387’
这样可以避免连接,但降低了程序的清晰程度。使用 IN,可以按如下所示编写相同部分,其清晰程度与第一个示例版本相同,效率与第二个示例版本相同:
assignee.last_name IN ‘Smith’
‘NOT’关键字不能与 IN 一起使用,例如“NOT IN”。
|
版权所有 © 2013 CA。
保留所有权利。
|
|