临时视图中各列的数据类型由初始子查询中的数据类型定义。递归子查询中各列的数据类型必须匹配。数据库服务器会自动尝试转换由递归子查询返回的值,以便与初始查询的那些值匹配。如果这无法实现,或者如果转换中可能会丢失信息,则会产生错误。
一般而言,当初始子查询返回实际值或 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 是 SMALL INT,但是数量列的数据类型是 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, subcomponent; |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |