临时视图中各列的数据类型由初始子查询中的数据类型定义。递归子查询中各列的数据类型必须匹配。数据库服务器会自动尝试转换由递归子查询返回的值,以便与初始查询的那些值匹配。如果这无法实现,或者如果转换中可能会丢失信息,则会生成错误。
一般而言,当初始子查询返回实际值或 NULL 值时,通常需要进行显式转换。当初始子查询从与递归子查询不同的列中选择值时,也可能需要进行显式转换。
如果初始子查询的列与递归子查询的列具有不同的域,则可能需要进行转换。对于初始子查询中的NULL 值,必须总是进行转换。
例如,书架部件激增示例会正确运行,因为初始子查询返回书架表的行,并因此继承了所选列的数据类型。
有关详细信息,请参见部件激增问题。
如果按照如下所示重写此查询,则需要进行显式转换。
WITH RECURSIVE parts (component, subcomponent, quantity) AS
( SELECT NULL, 'bookcase', 1 -- ERROR! Wrong domains!
UNION ALL
SELECT b.component, b.subcomponent,
p.quantity * b.quantity
FROM parts p JOIN bookcase b
ON p.subcomponent = b.component )
SELECT * FROM parts
ORDER BY component, subcomponent如果没有进行转换,就会由于以下原因而导致错误:
组件名的正确数据类型是 VARCHAR,但是第一列为 NULL。
假定数字 1 是短整数,但是数量列的数据类型是 INT。
不需要对第二列进行转换,因为初始查询的该列已经是字符串。
如果转换初始子查询中的数据类型,查询的行为可以像预期一样:
WITH RECURSIVE parts (component, subcomponent, quantity) AS
( SELECT CAST(NULL AS VARCHAR), -- CASTs must be used
'bookcase', -- to declare the
CAST( 1 AS INT) -- correct datatypes
UNION ALL
SELECT b.component, b.subcomponent,
p.quantity * b.quantity
FROM parts p JOIN bookcase b
ON p.subcomponent = b.component )
SELECT * FROM parts
ORDER BY component, subcomponentSQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。