Data Shaping技术--Shape Append 命令

发表于:2007-06-30来源:作者:点击数: 标签:
Shape APPEND 命令将子 Recordset 分配给父 Recordset 中 Field 对象的 Value 属性。 语法 SHAPE {parent-command} [[AS] parent-alias] APPEND ({child-command} [AS] child-alias RELATE parent-column TO child-column...) [[AS] chapter-alias] ... 组成
Shape APPEND 命令将子 Recordset 分配给父 Recordset 中 Field 对象的 Value 属性。

语法

SHAPE {parent-command} [[AS] parent-alias]

APPEND ({child-command} [AS] child-alias

RELATE parent-column TO child-column...) [[AS] chapter-alias] ...

组成说明

该命令的组成部分为:

parent-command, child-command 如下之一。

在尖括号(“{}”)中的查询命令,返回 Recordset 对象。命令发布给基本数据提供者,其语法取决于该提供者的要求。虽然 ADO 并不要求使用任何指定的查询语言,但通常是使用结构化查询语言 (SQL)。圆括号(“()”)是必需的关键字,它们将子集列追加到引用由查询命令返回的 Recordset 的父。


以前成形的 Recordset 的名称。


另一个 Shape 命令。


TABLE 关键字,后跟表的名称。
parent-column 由 parent-command 返回的 Recordset 中的列。

child-column 由 child-command 返回的 Recordset 中的列。

... “parent-column TO child-column”子句实际上是列表,并用逗号将每个定义关系分隔开。

chapter-alias 别名,对追加到父的列的引用。

parent-alias 别名,对父 Recordset 的引用。

child-alias 别名,对子 Recordset 的引用。

... 在 APPEND 关键字后面的子句实际上是列表(每个子句使用逗号分隔),定义被追加到父的另一个列。

操作

发出 parent-command 并返回父 Recordset。然后发出 child-command 并返回子 Recordset。

例如,parent-command 可以从客户表返回公司的客户 Recordset,而 child-command 从定货表返回所有客户的定单 Recordset。

一般,父和子 Recordset 对象必须各自拥有用于关联父和子的列。列在 RELATE 子句中命名,parent-column 在先,child-column 在后。在各自的 Recordset 中,列可以有不同名称,但必须引用相同信息以便指定有意义的关系。例如,Customers 和 Orders Recordsets 可以同时拥有 customerID 字段。

数据构形将子集列追加到父 Recordset。子集列中的值是对子 Recordset 中列的引用,子 Recordset 满足 RELATE 子句。即在给定父行中的 parent-column 与在子集子的所有行中的 child-column 具有相同的值。

当您访问在子集列中的引用时,ADO 将自动检索由引用表示的 Recordset。注意尽管已经检索了全部子 Recordset,但子集(chapter)仅表示行的子集。

如果追加的列没有 chapter-alias,则会自动生成其名称。列的 Field 对象将被追加到 Recordset 对象的 Fields 集合,其数据类型将是 adChapter。

有关定位分级 Recordset 的详细信息,请参阅访问分级 Recordset 中的行。

参数化命令

如果您正在处理大的子 Recordset(尤其是比父 Recordset 大),却只需要访问部分子子集,那么,使用参数化命令会更有效。

non-parameterized command(非参数化命令)同时检索整个父和子 Recordsets,并将子集列追加到父,然后为每个父行指定相关子子集的引用。

parameterized command(参数化命令)检索整个父 Recordset,但在访问子集列时仅检索子集 Recordset。这种检索策略的差别可以有益的性能好处。

例如,可以指定如下:

"SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)"
父和子表通常拥有列名 cust_id。child-command 有占位符(即“?”),受 RELATE 子句引用(即“...PARAMETER 0”)。关系在于显性标识的 customer 表 parent-column(即 cust_id)和隐性标识的 orders 表 child-column(即 cust_id)之间,由占位符和“PARAMETER 0”指定。

注意 PARAMETER 子句仅属于 Shape 命令语法。与 ADO Parameter 属性和 Parameters 集合均无关联。

在执行 Shape 命令时,发生如下情形:

执行 parent-command,并返回 customer 表的父 Recordset。


子集列被追加到父 Recordset。


在访问父行的子集列时,customer.cust_id 列的值将替换 orders.cust_id 的占位符,并执行 child-command。


orders 表(在此,orders.cust_id 列的值与 customer.cust_id 列的值相匹配)的所有行被检索。


对检索到的子行(即子 Recordset 的 chapter)的引用被放置在父 Recordset 当前行的子集列。


当访问另一个行的子集列时,重复步骤 3-5。
插入 Shape COMPUTE 命令

现在将参数化 Shape 命令的参数化命令嵌入任意嵌套数量的形状 COMPUTE 命令中是有效的。例如:

SHAPE {select au_lname, state from authors} APPEND
((SHAPE
(SHAPE
{select * from authors where state = ?} rs
COMPUTE rs, ANY(rs.state) state, ANY(rs.au_lname) au_lname
BY au_id) rs2
COMPUTE rs2, ANY(rs2.state) BY au_lname)
RELATE state TO PARAMETER 0)

Shape Compute 命令


Shape COMPUTE 命令生成父 Recordset(其列由对子 Recordset 的引用组成)、可选的列(其内容是对子 Recordset 或以前成形的 Recordset 执行合计函数的结果)和在可选的 BY 子句中开列出的任何子 Recordset 的列。

语法

"SHAPE {child-command} [AS] child-alias

COMPUTE child-alias [ ,aggregate-command-field-list]

[BY grp-field-list]"

组成说明

该命令的组成是:

child-command 如下之一。

在尖括号(“{}”)中的查询命令,返回 Recordset 对象。命令发布给基本数据提供者,其语法取决于该提供者的要求。虽然 ADO 并不要求使用任何指定的查询语言,但通常是使用结构化查询语言 (SQL)。


以前成形的 Recordset 的名称。


另一个形状(Shape)命令。


TABLE 关键字,后跟表的名称。
child-alias 别名,用于引用由 child-command 返回的 Recordset。在 COMPUTE 子句的列的列表中需要 child-alias,用于定义父和子 Recordset 对象的关系。

aggregate-command-field-list 列表,定义在生成的父中的列,含有对子 Recordset 执行合计函数所产生的值。

grp-field-list 在父和子 Recordset 对象中的列的列表,指定在子中的行如何分组。

对在 grp-field-list 中的每个列,在父和子 Recordset 对象中有对应的列。对父 Recordset 的每个行,grp-field-list 列有唯一的值,并且由父行引用的子 Recordset 由子行(其 grp-field-list 列含有与父行相同的值)单独组成。

如果 COMPUTE 子句包含合计函数,但没有 BY 子句,那么,只有一个父行含有整个子 Recordset 的合计值。如果有 BY 子句,那么,有多个父行均分别含有引用和子 Recordset 的合计值。

操作

child-command 被发布给提供者,并返回子 Recordset。

COMPUTE 子句指定父 Recordset 的列,该 Recordset 可以是对子 Recordset 的引用、一个或多个合计、计算表达式或新列。如果有 BY 子句,那么,它定义的列同时被追加到父 Recordset 中。BY 子句指定子 Recordset 的行分组的方式。

例如,假定有一个人口统计表,包括 State、City 和 Population 字段(人口数字单独说明)。

State City Population
WA Seattle 700,000
OR Medford 200,000
OR Portland 600,000
CA Los Angeles 900,000
CA San Diego 400,000
WA Tacoma 500,000
OR Corvallis 300,000


现在,发出该 Shape 命令:

rst.Open "SHAPE {select * from demographics} AS rs
COMPUTE SUM(rs.population), rs
BY state",
connection
该命令打开具有两个层次的成形 Recordset。父层是生成的 Recordset,有合计列 (SUM(rs.population))、引用子 Recordset (rs) 的列和分组 Recordset (州)的列。子层是由查询命令 (select * from demographics) 返回的 Recordset。

子 Recordset 具体行将由 State 分组,但不按照特定的顺序。即分组将不采用字母或数字顺序。

现在,您可以定位打开的父 Recordset,并访问具体的子 Recordset 对象。请参阅访问分级 Recordset 中的行。

所得到的父和子具体的 Recordsets



SUM (rs.Population) rs State
1,300,000 Reference to child1 CA
1,200,000 Reference to child2 WA
1,100,000 Reference to child3 OR


子 1

State City Population
CA Los Angeles 900,000
CA San Diego 400,000


子 2

State City Population
WA Seattle 700,000
WA Tacoma 500,000


子 3

State City Population
OR Medford 200,000
OR Portland 600,000
OR Corvallis 300,000

原文转自:http://www.ltesting.net