Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 公用表表达式 » 递归公用表表达式

 

递归公用表表达式中的数据类型声明

临时视图中各列的数据类型由初始子查询中的数据类型定义。递归子查询中各列的数据类型必须匹配。数据库服务器会自动尝试转换由递归子查询返回的值,以便与初始查询的那些值匹配。如果这无法实现,或者如果转换中可能会丢失信息,则会产生错误。

一般而言,当初始子查询返回实际值或 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;
 另请参见