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

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfrage und Änderung von Daten » Allgemeine Tabellenausdrücke » Rekursive allgemeine Tabellenausdrücke

 

Datentyp-Deklarationen in rekursiven allgemeinen Tabellenausdrücken

Die Datentypen der Spalten in der temporären Ansicht werden durch jene in der anfänglichen 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 anfänglichen 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 anfängliche Unterabfrage einen Literal oder NULL ergibt. Explizite Typenfestlegungen können auch erforderlich sein, wenn die anfängliche Unterabfrage Werte aus anderen Spalten als die rekursive Unterabfrage auswählt.

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

Das Stücklistenproblem funktioniert beispielsweise deshalb, weil die anfängliche Unterabfrage Zeilen aus der Bücherregal-Tabelle zurückgibt und die Datentypen der ausgewählten Spalten übernimmt.

Wenn diese Abfrage jedoch 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 anfänglichen 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;
 Siehe auch