delphi,里面的一个SQL语句。使用到了SHAPE。请问一下,shape有什么作用? 谢谢。sSQL := 'SHAPE { ' +
' SELECT ITEM_CODE,QTY,PRICE,TYPE,KIT_ID,TP_CODE,'+.......
.......请问一下, shape的作用是什么?谢谢。
' SELECT ITEM_CODE,QTY,PRICE,TYPE,KIT_ID,TP_CODE,'+.......
.......请问一下, shape的作用是什么?谢谢。
不同种类的形状
您可以创建三种形状:• 基于关系
• 基于参数
• 基于组
每种类型都有各自的优缺点。您需要选择最适合您的应用程序要求以及运行应用程序的环境的机制。
基于关系的层次
基于关系和基于参数的层次生成的层次也可由 SQL JOIN 语句表示。但是,它们读取父记录和子记录的方式不同。在基于关系的层次中,要先将所有的父记录和子记录读入本地缓存后再开始进行处理。因此,基于关系的层次在检索记录时的初始开销较高。但是初始检索之后的开销较低。
基于参数的层次
基于参数的层次最初只读取父记录,然后根据需要获取子记录。尽管降低了初始开销,但您必须向所访问的每个父记录发出新的子查询,而且只要记录集打开就必须保持与数据源的连接。
基于组的层次
基于组的层次等价于生成一个与细目 SQL 语句联合的聚合 SQL 语句。基于组的层次也等价于对非规范化的数据执行聚合函数。您无法更新求和列和计算列,因为这些列是从多个记录得到的。同基于关系的层次一样,必须预先读取所有记录。
回到顶端 简化语法
使用 SHAPE 子句可以生成层次化记录集。本节提供简化的语法。由于 SHAPE 语法会变得非常复杂,本文的末尾提供了 SHAPE 子句的正则语法,可用于扩展示例。您可以使用本文末尾的程序测试您自己的 SHAPE 语句。 SHAPE {parent-statement}
APPEND Aggregate
| ({child-statement} [As Alias]
RELATE parent-field TO child-field | parameter-er
[, parent-field TO child-field | parameter-er ...])
[, Aggregate | ({child statement})...] SHAPE {non-normalized-statement} [AS Alias]
COMPUTE Aggregate
| Alias
| ({child-statement} [As Alias] RELATE parent-field TO
child-field | parameter-er)
[, Aggregate | Alias | ({child-statement}...)]
[BY grouping-field [, grouping-field]] SHAPE {non-normalized-statement} [AS Alias]
BY grouping-field [, grouping-field]
回到顶端 备注
• 如果您选择的字段是来自不同表中的同名字段,可能需要为这些字段指派别名,以使 SHAPE 分析器正常工作。
• SHAPE APPEND 语法的功能和 OUTER JOIN 语句类似,即使相应的子记录不存在,也会返回一个父记录。
• 聚合只能对记录集的相邻子记录中的字段进行操作。若要对子子级等中的字段进行操作,必须生成中间聚合。请参见带聚合的组层次演示示例。
• 如果通过 SHAPE APPEND 语法使用聚合函数,聚合值将占用父结果集的附加字段,此附加字段还包含来自父语句的字段。相反,SHAPE COMPUTE 和 SHAPE BY 为聚合创建一个新的父级,而非规范化语句成为子级记录集。
• SHAPE 提供程序要求您在使用 SHAPE COMPUTE 时,在 COMPUTE 子句中包括非规范化语句的别名。否则,即使您没有收到语法错误,也会收到一条表明不支持该功能的错误信息。 回到顶端 示例
本部分提供了图表示例。这些示例使用罗斯文 (Northwind) 示例数据库中的表。
简单关系层次
SHAPE {select * from customers}
APPEND ({select * from orders} AS rsOrders
RELATE customerid TO customerid)
生成: Customers.*
rsOrders
|
+----Orders.*
在以下图表中,父记录集包含 Customers 表中的所有字段以及名为 rsOrders 的字段。rsOrders 提供了对子记录集的引用并包含 Orders 表的所有字段。其他示例使用了类似的标记。
参数化层次
SHAPE {select * from customers}
APPEND ({select * from orders where customerid = ?}AS rsOrders
RELATE customerid TO PARAMETER 0)
与简单关系层次生成的层次相同。
复合关系层次
本示例演示了 customers、orders 和 order details 的一个三级层次:: SHAPE {SELECT * from customers}
APPEND ((SHAPE {select * from orders}
APPEND ({select * from [order details]} AS rsDetails
RELATE orderid TO orderid)) AS rsOrders
RELATE customerid TO customerid)
生成: Customers.*
rsOrders
|
+---- Orders.*
rsDetails
|
+----[Order Details].*
多重关系层次
本示例演示了包含一个父记录集和两个子记录集(其中一个为参数化记录集)的层次: SHAPE {SELECT * FROM customers}
APPEND ({SELECT *
FROM orders
WHERE orderdate < #1/1/1998# AND customerid = ?}
RELATE customerid TO PARAMETER 0) AS rsOldOrders,
({SELECT *
FROM orders
WHERE orderdate >= #1/1/1998#}
RELATE customerid TO customerid) AS rsRecentOrders
生成: Customers.*
rsOldOrders
|
+---- Orders.*
rsRecentOrders
|
+----Orders.*
带聚合的层次
SHAPE (select * from orders}
APPEND ({select od.orderid, od.UnitPrice * od.quantity as ExtendedPrice
from [order details] As od}
RELATE orderid TO orderid) As rsDetails,
SUM(ExtendedPrice) AS OrderTotal
生成: Orders.*
rsDetails
|
+----orderid
ExtendedPrice
OrderTotal
组层次
SHAPE {select customers.customerid AS cust_id, orders.*
from customers inner join orders
on customers.customerid = orders.customerid} AS rsOrders
COMPUTE rsOrders BY cust_id
生成: rsOrders
|
+----cust_id
Orders.*
cust_id
带聚合的组层次
备注:本示例中的内嵌 SHAPE 子句与带聚合的层次示例中使用的语句相同。 SHAPE
(SHAPE {select customers.*, orders.orderid, orders.orderdate
from customers inner join orders
on customers.customerid = orders.customerid}
APPEND ({select od.orderid,
od.unitprice * od.quantity as ExtendedPrice
from [order details] as od} AS rsDetails
RELATE orderid TO orderid),
SUM(rsDetails.ExtendedPrice) AS OrderTotal) AS rsOrders
COMPUTE rsOrders,
SUM(rsOrders.OrderTotal) AS CustTotal,
ANY(rsOrders.contactname) AS Contact
BY customerid
生成: rsOrders
|
+----Customers.*
orderid
orderdate
rsDetails
|
+----orderid
ExtendedPrice
OrderTotal
CustomerTotal
Contact
customerid
多重分组
SHAPE
(SHAPE {select customers.*,
od.unitprice * od.quantity as ExtendedPrice
from (customers inner join orders
on customers.customerid = orders.customerid) inner join
[order details] as od on orders.orderid = od.orderid}
AS rsDetail
COMPUTE ANY(rsDetail.contactname) AS Contact,
ANY(rsDetail.region) AS Region,
SUM(rsDetail.ExtendedPrice) AS CustTotal,
rsDetail
BY customerid) AS rsCustSummary
COMPUTE rsCustSummary
BY Region
生成: rsCustSummary
|
+-----Contact
Region
CustTotal
rsDetail
|
+----Customers.*
ExtendedPrice
customerid
Region
总计
SHAPE
(SHAPE {select customers.*,
od.unitprice * od.quantity as ExtendedPrice
from (customers inner join orders
on customers.customerid = orders.customerid) inner join
[order details] as od on orders.orderid = od.orderid}
AS rsDetail
COMPUTE ANY(rsDetail.contactname) AS Contact,
SUM(rsDetail.ExtendedPrice) AS CustTotal,
rsDetail
BY customerid) AS rsCustSummary
COMPUTE SUM(rsCustSummary.CustTotal) As GrandTotal,
rsCustSummary
注意,在外层求和中缺少 BY 子句。此示例定义了总计,因为父级行集合包含总计的单个记录和一个指向子记录集的指针。 GrandTotal