使用DB2 UDB OLAP函数
2008-09-03 16:28:17 来源:WEB开发网同样,如果理解了如何联结 GUEST 和 ROOM 表中的记录,就可以通过一条简单的 insert 语句填充 GUEST_ASSIGNMENT 表。这种方法显然比迭代客人上的游标和房间上的游标要容易得多。
使用累加和将货物箱分配给卡车
本章中要讨论的这个问题非常类似于前面的两个问题。这次我将演示累加和是如何简化查询的开发的。
假设需要将一些大小一致的箱子装载到几辆容量不等的卡车上。实际上这是一个非常常见的资源分配问题,这种问题通常使用游标来解决。
下面是表的定义以及一些样本数据:
createTABLETRUCK(
TRUCK_IDINTNOTNULLPRIMARYKEY,
CAPACITYSMALLINTNOTNULL);
insertINTOTRUCKVALUES(11,3),(22,2),(33,3);
createTABLECARGO_BOX(
CARGO_BOX_IDINTNOTNULLPRIMARYKEY,
DESCRIPTIONVARchar(40));
insertINTOCARGO_BOXVALUES(101,’PEACHES’),(102,’POTATOES’),(103,’TOMATOES’),(104,’TOMATOES’),(105,’TOMATOES’),
(106,’PINEAPPLES’),(107,’PINEAPPLES’);
createTABLEBOX_IN_TRUCK(
TRUCK_IDINTNOTNULL,
CARGO_BOX_IDINTNOTNULL,
FOREIGNKEY(TRUCK_ID)REFERENCESTRUCK(TRUCK_ID),
FOREIGNKEY(CARGO_BOX_ID)REFERENCESCARGO_BOX(CARGO_BOX_ID));
问题是恰当地填充 BOX_IN_TRUCK 表,意即将箱子分配给卡车,使得没有卡车超载。通常需要使用游标来完成这一任务。不过,如果使用 OLAP 函数,即使没有游标也能完成这一任务。
insertINTOBOX_IN_TRUCK
select
TRUCK_CUMULATIVE.TRUCK_ID,
CARGO_BOX.CARGO_BOX_ID
FROM
(selectSUM(CAPACITY)OVER(ORDERBYTRUCK_ID)-CAPACITY+1ASBOX_FROM,
SUM(CAPACITY)OVER(ORDERBYTRUCK_ID)ASBOX_TO,CAPACITY,TRUCK_IDFROMTRUCK)ASTRUCK_CUMULATIVE
join
(selectROW_NUMBER()OVER()ASROW_NUMBER,CARGO_BOX_IDFROMCARGO_BOX)ASCARGO_BOX
ONROW_NUMBERBETWEENBOX_FROMANDBOX_TO;
更多精彩
赞助商链接