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

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » 共通テーブル式

 

再帰共通テーブル式でのデータ型宣言

テンポラリ・ビュー内のカラムのデータ型は、初期サブクエリのデータ型によって定義されます。再帰サブクエリのカラムのデータ型は、一致する必要があります。データベース・サーバは、再帰サブクエリによって返された値がその初期クエリの値に一致するよう、自動的に変換しようとします。これが不可能な場合、または変換で情報が失われた場合、エラーが生成されます。

通常、初期サブクエリがリテラル値または NULL を返す場合、明示的なキャストが必要な場合がほとんどです。初期サブクエリが再帰サブクエリとは異なるカラムから値を選択する場合も、明示的なキャストが必要な場合があります。

キャストは、初期サブクエリのカラムが再帰サブクエリのカラムと同じドメインを持っていない場合に必要な場合があります。初期サブクエリでは、NULL 値に常にキャストを適用する必要があります。

たとえば、本棚の構成部品のサンプルは、初期サブクエリが bookcase テーブルからローを返すことによって、選択されたカラムのデータ型を継承するため、正しく動作します。構成部品の問題を参照してください。

このクエリが次のように書き直された場合は、明示的なキャストが必要です。

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 と見なされるが、quantity カラムのデータ型は INT である。

2 番目のカラムには、キャストは不要です。初期クエリのこのカラムがすでに文字列であるためです。

初期サブクエリでデータ型をキャストすれば、クエリを意図したとおりに動作させることができます。

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;