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