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; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |