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

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Allgemeine Tabellenausdrücke

 

Datentyp-Deklarationen in rekursiven allgemeinen Tabellenausdrücken

Die Datentypen der Spalten in der temporären Ansicht werden durch jene in der Anfangs-Unterabfrage definiert. Die Datentypen der Spalten von der rekursiven Unterabfrage müssen übereinstimmen. Der Datenbankserver versucht, die von der rekursiven Unterabfrage zurückgegebenen Werte automatisch zu konvertieren, damit sie mit jenen der Anfangs-Unterabfrage übereinstimmen. Wenn das nicht möglich ist oder wenn bei der Konvertierung Informationen verloren gehen, wird ein Fehler generiert.

Im Allgemeinen sind explizite Typenfestlegungen notwendig, wenn die Anfangs-Unterabfrage einen Literal oder NULL ergibt. Explizite Typenfestlegungen können auch erforderlich sein, wenn die Anfangs-Unterabfrage Werte aus anderen Spalten als die rekursive Unterabfrage auswählt.

Typenfestlegungen sind möglicherweise erforderlich, wenn die Spalten der Anfangs-Unterabfrage nicht dieselben Domänen wie die rekursive Unterabfrage haben. Tyenfestlegungen in der Anfangs-Unterabfrage müssen immer auf NULL angewendet werden.

Das Beispiel mit dem Stücklistenproblem des Bücherregals hat deshalb funktioniert, weil die Anfangs-Unterabfrage Zeilen aus der Bücherregal-Tabelle zurückgegeben und die Datentypen der ausgewählten Spalten übernommen hat. Siehe Das Stücklistenproblem.

Wenn die Abfrage folgendermaßen umgeschrieben wird, sind explizite Typenfestlegungen erforderlich:

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;

Ohne Typenfestlegungen ergeben sich Fehler, und zwar aus folgenden Gründen:

  • Der korrekte Datentyp für Komponentennamen ist VARCHAR, aber die erste Spalte ist NULL.

  • Die Ziffer 1 lässt auf SMALL INT schließen, doch der Datentyp der Mengenspalte ist INT.

Bei der zweiten Spalte ist keine Typenfestlegung erforderlich, weil diese Spalte der Anfangs-Abfrage bereits eine Zeichenfolge ist.

Eine Typenfestlegung des Datentyps in der Anfangs-Unterabfrage ermöglicht es der Abfrage, sich wie vorgesehen zu verhalten.



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;