Collection Contents 上一页 下一页 PDF

ASA 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

如果没有进行转换,就会由于以下原因而导致错误:

不需要对第二列进行转换,因为初始查询的该列已经是字符串。

如果转换初始子查询中的数据类型,查询的行为可以像预期一样:

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

Collection Contents 上一页 下一页 PDF