Gibt die Datenbanktabellen oder Ansichten an, die in einer DELETE-, SELECT- oder UPDATE-Anweisung verwendet werden. Wenn sie in einer SELECT-Anweisung verwendet wird, kann die FROM-Klausel auch in einer MERGE- oder INSERT-Anweisung verwendet werden.
FROM table-expression, ...
table-expression : table-name | view-name | procedure-name | derived-table | lateral-derived-table | join-expression | ( table-expression, ... ) | openstring-expression | apply-expression | contains-expression | dml-derived-table
table-name : [ userid.]table-name ] [ [ AS ] correlation-name ] [ WITH ( hint [...] ) ] [ FORCE INDEX ( index-name ) ]
view-name : [ userid.]view-name [ [ AS ] correlation-name ] [ WITH ( table-hint ) ]
procedure-name : [ owner.]procedure-name ( [ parameter, ... ] ) [ WITH ( column-name data-type, ... ) ] [ [ AS ] correlation-name ]
derived-table : ( select-statement ) [ AS ] correlation-name [ ( column-name, ... ) ]
lateral-derived-table : LATERAL ( select-statement | table-expression ) [ AS ] correlation-name [ ( column-name, ... ) ]
join-expression :
table-expression join-operator table-expression
[ ON join-condition ]
join-operator : [ KEY | NATURAL ] [ join-type ] JOIN | CROSS JOIN
join-type : INNER | LEFT [ OUTER ] | RIGHT [ OUTER ] | FULL [ OUTER ]
hint : table-hint | index-hint
table-hint : READPAST | UPDLOCK | XLOCK | FASTFIRSTROW | HOLDLOCK | NOLOCK | READCOMMITTED | READUNCOMMITTED | REPEATABLEREAD | SERIALIZABLE
index-hint : NO INDEX | INDEX ( [ PRIMARY KEY | FOREIGN KEY ] index-name [, ...] ) [ INDEX ONLY { ON | OFF } ] | CLUSTERED INDEX [ INDEX ONLY { ON | OFF } ]
openstring-expression : OPENSTRING ( { FILE | VALUE } string-expression ) WITH ( rowset-schema ) [ OPTION ( scan-option ... ) ] [ AS ] correlation-name
apply-expression : table-expression { CROSS | OUTER } APPLY table-expression
contains-expression : { table-name | view-name } CONTAINS ( column-name [,...], contains-query ) [ [ AS ] score-correlation-name ]
rowset-schema : column-schema-list | TABLE [owner.]table-name [ ( column-list ) ]
column-schema-list :
{ column-name user-or-base-type | filler( ) } [ , ... ]
column-list :
{ column-name | filler( ) } [ , ... ]
scan-option : BYTE ORDER MARK { ON | OFF } | COMMENTS INTRODUCED BY comment-prefix | { COMPRESSED | AUTO | NOT COMPRESSED } | DELIMITED BY string | ENCODING encoding | { ENCRYPTED KEY key-expression | NOT ENCRYPTED } | ESCAPE CHARACTER character | ESCAPES { ON | OFF } | FORMAT { TEXT | BCP } | HEXADECIMAL { ON | OFF } | QUOTE string | QUOTES { ON | OFF } | ROW DELIMITED BY string | SKIP integer | STRIP { ON | OFF | LTRIM | RTRIM | BOTH }
key-expression : string | variable
contains-query : string
dml-derived-table : ( dml-statement ) REFERENCING ( [ table-version-names | NONE ] )
dml-statement : insert-statement delete-statement update-statement merge-statement
table-version-names : OLD [ AS ] correlation-name [ FINAL [ AS ] correlation-name ] | FINAL [ AS ] correlation-name
table-name Eine Basistabelle oder temporäre Tabelle. Tabellen, die einem anderen Benutzer gehören, können durch die Angabe der Benutzer-ID qualifiziert werden. Tabellen, deren Eigentümer Gruppen sind, zu denen der aktuelle Benutzer gehört, werden standardmäßig auch ohne Angabe der Benutzer-ID gefunden.
view-name Gibt eine in die Abfrage einzubeziehende Ansicht an. Genau wie Tabellen können auch Ansichten, die einem anderen Benutzer gehören, durch die Angabe der Benutzer-ID qualifiziert werden. Ansichten, deren Eigentümer Gruppen sind, zu denen der aktuelle Benutzer gehört, werden standardmäßig auch ohne Angabe der Benutzer-ID gefunden. Obwohl die Syntax Tabellen-Hints zulässt, haben solche Hints keine Auswirkung.
procedure-name Eine gespeicherte Prozedur, die eine Ergebnismenge zurückgibt. Diese Klausel gilt nur für die FROM-Klausel von SELECT-Anweisungen. Die Klammern nach dem Prozedurnamen sind erforderlich, auch wenn die Prozedur keine Parameter erhält. DEFAULT kann anstelle eines optionalen Parameters angegeben werden.
Wenn die gespeicherte Prozedur mehrere Ergebnismengen zurückgibt, wird nur die erste verwendet.
Die WITH-Klausel bietet eine Möglichkeit, Spaltennamenaliase für die Ergebnismenge der Prozedur anzugeben. Wenn eine WITH-Klausel angegeben ist, muss die Anzahl der Spalten der Anzahl von Spalten in der Ergebnismenge der Prozedur entsprechen, und die Datentypen müssen mit denen in der Ergebnismenge der Prozedur übereinstimmen. Wenn keine WITH-Klausel angegeben ist, werden die Spaltennamen und Typen verwendet, die von der Prozedurdefinition definiert wurden. Die folgende Abfrage veranschaulicht die Verwendung der WITH-Klausel:
SELECT sp.ident, sp.quantity, Products.name FROM ShowCustomerProducts( 149 ) WITH ( ident INT, description CHAR(20), quantity INT ) sp JOIN Products ON sp.ident = Products.ID; |
Für Embedded SQL-Anwendungen. Wenn Sie eine Prozedur ohne RESULT-Klausel erstellen und die Prozedur eine variable Ergebnismenge zurückgibt, kann ein DESCRIBE der SELECT-Anweisung mit Verweis auf die Prozedur fehlschlagen. Um ein Fehlschlagen des DESCRIBE-Vorgangs zu verhindern, ist es empfehlenswert, eine WITH-Klausel einzubeziehen, die das erwartete Schema der Ergebnismenge beschreibt.
derived-table Sie können eine SELECT-Anweisung anstelle eines Tabellen- oder Ansichtsnamens in der FROM-Klausel angeben. Eine auf diese Art verwendete SELECT-Anweisung wird als abgeleitete Tabelle bezeichnet und muss einen Alias erhalten. Beispiel: Die nachstehende Anweisung enthält eine abgeleitete Tabelle namens MyDerivedTable, die Produkte in der Products-Tabelle nach UnitPrice ordnet.
SELECT TOP 3 * FROM ( SELECT Description, Quantity, UnitPrice, RANK() OVER ( ORDER BY UnitPrice ASC ) AS Rank FROM Products ) AS MyDerivedTable ORDER BY Rank; |
lateral-derived-table Eine abgeleitete Tabelle, gespeicherte Prozedur oder verknüpfte Tabelle, die Referenzen auf Objekte in der übergeordneten Anweisung (oder Outer-Referenzen) enthalten kann. Sie müssen eine lateral abgeleitete Tabelle benutzen, wenn Sie eine äußere Referenz in der FROM-Klausel verwenden wollen.
Sie können äußere Referenzen nur für Tabellen verwenden, die der lateral abgeleiteten Tabelle in der FROM-Klausel vorangehen. Beispielsweise können Sie keine äußere Referenz für ein Element in der Auswahlliste verwenden.
Die Tabelle und die äußere Referenz müssen durch ein Komma getrennt sein. Beispielsweise sind folgende Abfragen gültig:
SELECT * FROM A, LATERAL( B LEFT OUTER JOIN C ON ( A.x = B.x ) ) myLateralDT; |
SELECT * FROM A, LATERAL( SELECT * FROM B WHERE A.x = B.x ) myLateralDT; |
SELECT * FROM A, LATERAL( procedure-name( A.x ) ) myLateralDT; |
Die Angabe von LATERAL ( table-expression) ist zur Angabe von LATERAL ( SELECT * FROM table-expression ) äquivalent.
openstring-expression Verwenden Sie eine OPENSTRING-Klausel, um eine Abfrage innerhalb einer Datei oder einem Blob durchzuführen, wobei der Inhalt dieser Quellen als Zeilenmenge behandelt wird. Dabei geben Sie auch Informationen über das Schema der Datei oder des Blobs für die Erzeugung der Ergebnismenge an, da Sie keine definierte Struktur wie eine Tabelle oder Ansicht abfragen. Diese Klausel gilt nur für die FROM-Klausel einer SELECT-Anweisung. Wird für UPDATE- oder DELETE-Anweisungen nicht unterstützt.
Die ROWID-Funktion wird über die Ergebnismenge einer Tabelle unterstützt, die von einem OPENSTRING-Ausdruck erstellt wird.
Die folgenden Unterklauseln und Parameter der OPENSTRING-Klausel werden verwendet, um Daten in Dateien und Blobs zu definieren und abzufragen:
FILE- und VALUE-Klauseln Verwenden Sie die FILE-Klausel, um die abzufragende Datei anzugeben. Verwenden Sie die VALUE-Klausel, um den abzufragenden Blob-Ausdruck anzugeben. Der Datentyp für den Blob-Ausdruck wird als LONG BINARY angenommen. Sie können die READ_CLIENT_FILE-Funktion als Wert für die VALUE-Klausel angeben.
Wenn weder das FILE- noch das VALUE-Schlüsselwort angegeben ist, wird VALUE angenommen.
Bei der Verwendung von FORMAT SHAPEFILE wird nur FILE angenommen.
WITH-Klausel
Verwenden Sie diese Klausel, um das Rowset-Schema (Spaltennamen und Datentypen) der abzufragenden Daten anzugeben.
Sie können die Spalten direkt angeben (z.B. WITH ( Surname CHAR(30), GivenName CHAR(30) )
). Sie können auch die TABLE-Unterklausel verwenden, um eine Tabelle für den Abruf von Schemainformationen zu referenzieren
(z.B. WITH TABLE dba.Employees ( Surname, GivenName )
). Sie müssen Eigentümer der angegebenen Tabelle sein oder SELECT-Berechtigungen dafür haben.
Bei der Angabe von Spalten können Sie filler( ) für Spalten verwenden, die sie bei den Eingabedaten auslassen möchten (z.B.
WITH ( filler( ), Surname CHAR(30), GivenName CHAR(30) )
).
OPTION-Klausel Verwenden Sie die OPTION-Klausel, um Optionen für die syntaktische Analyse der Eingabedatei anzugeben, wie Escapezeichen, Begrenzer, Kodierung, usw. Unterstützte Optionen enthalten jene Optionen aus der LOAD TABLE-Anweisung, die die syntaktische Analyse einer Eingabedatei steuern.
scan-option Informationen über die einzelnen Scanoptionen finden Sie bei den Ladeoptionen, die unter LOAD TABLE-Anweisung beschrieben werden.
apply-expression Verwenden Sie diese Klausel, um eine Join-Bedingung anzugeben, in der der rechte table-expression für jede Zeile im linken table-expression ausgewertet wird. Sie können zum Beispiel einen Apply-Ausdruck verwenden, um eine Funktion, eine Prozedur oder eine abgeleitete Tabelle für jede Zeile in einem Tabellenausdruck auszuwerten.
contains-expression Verwenden Sie die CONTAINS-Klausel nach einem Tabellennamen, um die Tabelle zu filtern und nur jene Zeilen zurückzugeben, die zur Volltextabfrage passen, die Sie in contains-expression eingegeben haben. Jede übereinstimmende Zeile der Tabelle wird gemeinsam mit einer Score-Spalte zurückgegeben, die mit score-correlation-name referenziert werden kann, wenn dieser angegeben ist. Wenn score-correlation-name nicht angegeben ist, kann die Score-Spalte mit dem Standardkorrelationsnamen "contains" referenziert werden.
Mit Ausnahme des optionalen Korrelationsname-Arguments übernimmt die CONTAINS-Klausel dieselben Argumente wie die CONTAINS-Suchbedingung.
Es muss ein Textindex für die Spalten vorhanden sein, die in der CONTAINS-Klausel aufgelistet sind.
Die contains-query darf nicht NULL oder eine leere Zeichenfolge sein. Wenn die Textkonfigurationseinstellungen das Löschen aller Begriffe in der contains-query bewirken, werden Zeilen aus der vom contains-expression referenzierten Basistabelle nicht zurückgegeben.
correlation-name Verwenden Sie correlation-name, um einen Ersatznamen für eine Tabelle oder Ansicht in der FROM-Klausel anzugeben. Der Ersatzname kann dann von anderen Elementen in der Anweisung referenziert werden. Beispiel: emp und dep sind Korrelationsnamen für die Tabellen Employees und Departments:
SELECT Surname, GivenName, DepartmentName FROM Employees emp, Departments dep, WHERE emp.DepartmentID=dep.DepartmentID; |
dml-statement Verwenden Sie dml-statement zum Festlegen der DML-Anweisung (INSERT, DELETE, UPDATE oder MERGE), aus der Sie Zeilen auswählen möchten. Während der Ausführung wird zuerst die als dml-derived-table angegebene DML-Anweisung ausgeführt und die davon betroffenen Zeilen werden in eine temporäre Tabelle materialisiert, deren Spalten durch die REFERENCING-Klausel beschrieben werden. Die temporäre Tabelle repräsentiert die Ergebnismenge von dml-derived-table.
Verwenden Sie REFERENCING ( ) oder REFERENCING ( NONE ), wenn die Ergebnisse nicht in eine temporäre Tabelle materialisiert werden müssen, weil sie nicht in der Abfrage referenziert werden.
Wenn Sie REFERENCING ( ) oder REFERENCING ( NONE ) angeben, werden die aktualisierten Zeilen nicht in eine temporäre Tabelle materialisiert, welche die Ergebnismenge von dml-derived-table darstellt, weil sie nicht in der Abfrage referenziert werden. Die temporäre Tabelle ist in diesem Fall eine leere Tabelle. Diese Funktion können Sie verwenden, wenn die dml-statement vor der Hauptanweisung ausgeführt werden soll.
In den Ergebnissen enthalten OLD-Spalten die Werte gemäß dem Scan, bei dem die zu aktualisierenden Zeilen gesucht wurden. FINAL-Spalten enthalten die Werte nach der Prüfung der referenziellen Integrität, der Berechnung und der Aktualisierung der Standardspalten und nachdem alle Trigger ausgelöst haben (ausgenommen AFTER-Trigger vom Typ FOR STATEMENT).
Anweisung | Unterstützte Tabellenversionen |
---|---|
INSERT | FINAL |
DELETE | OLD |
UPDATE | FINAL und/oder OLD |
MERGE | FINAL und/oder OLD |
Wenn Sie einen OLD-Namen und einen FINAL-Namen angeben, werden zwei Korrelationsnamen verwendet. Es handelt sich jedoch nicht
um echte Korrelationen, weil sich beide auf die dieselbe Ergebnismenge beziehen. Wenn Sie REFERENCING (OLD AS O FINAL AS F )
angeben, gibt es ein implizites Join-Prädikat: O.rowid = F.rowid
.
Die INSERT-Anweisung unterstützt nur FINAL. Daher erscheinen die Werte von aktualisierten Zeilen, die durch eine INSERT ON EXISTING UPDATE-Anweisung geändert werden, nicht in der Ergebnismenge der abgeleiteten Tabelle. Verwenden Sie stattdessen die MERGE-Anweisung, um den insert-else-update-Vorgang zu verarbeiten.
Die DML-Anweisung kann nur eine einzelne aktualisierbare Tabelle referenzieren. Aktualisierungen mehrerer Tabellen geben einen Fehler zurück. Darüber hinaus ist eine Auswahl aus dml-statement nicht zulässig, wenn die DML-Anweisung in einer korrelierten Unterabfrage oder einem allgemeinen Tabellenausdruck erscheint, weil die Semantik dieser Konstrukte unklar sein kann.
WITH table-hint-Klausel Mit der Klausel WITH table-hint können Sie das Verhalten festlegen, das nur für diese Tabelle und nur für diese Anweisung angewendet wird. Sie können diese Klausel verwenden, um das Verhalten zu ändern, ohne die Isolationsstufe zu ändern oder eine Datenbank- bzw. Verbindungsoption festlegen zu müssen. Tabellen-Hints können für Basistabellen, temporäre Tabellen und materialisierte Ansichten benutzt werden.
Bei der Klausel WITH table-hint handelt es sich um eine erweiterte Funktion, die nur dann verwendet werden sollte, wenn sie wirklich benötigt wird, und auch dann nur von erfahrenen Datenbankadministratoren. Zusätzlich kann es sein, dass die Einstellungen nicht in allen Situationen berücksichtigt werden.
Mit der Isolationsstufe zusammenhängende Tabellen-Hints Die Tabellen-Hints für Isolationsstufen werden verwendet, um das Isolationsstufenverhalten bei der Abfrage von Tabellen anzugeben. Sie geben eine Sperrmethode an, die nur bei den angegebenen Tabellen und nur für die aktuelle Abfrage gilt. Snapshot-Isolationsstufen können Sie nicht als Tabellen-Hints angeben.
Es folgt eine Liste der mit der Isolationsstufe zusammenhängenden Tabellen-Hints, die unterstützt werden:
Tabellen-Hint | Beschreibung |
---|---|
HOLDLOCK | Setzt das Verhalten auf ein Äquivalent der Isolationsstufe 3. Dieser Tabellen-Hint ist synonym mit SERIALIZABLE. |
NOLOCK | Setzt das Verhalten auf ein Äquivalent der Isolationsstufe 0. Dieser Tabellen-Hint ist synonym mit READUNCOMMITTED. |
READCOMMITTED | Setzt das Verhalten auf ein Äquivalent der Isolationsstufe 1. |
READPAST | Weist den Datenbankserver an, schreibgeschützte Zeilen zu ignorieren anstatt bei ihnen anzuhalten. Dieser Tabellen-Hint kann nur mit Isolationsstufe 1 verwendet werden. Der READPAST-Hint wird nur respektiert, wenn der Korrelationsname in der FROM-Klausel eine Basistabelle oder eine global gemeinsam genutzte temporäre Tabelle referenziert. Unter anderen Umständen (Ansichten, Proxytabellen und Tabellenfunktionen) wird der READPAST-Hint ignoriert. Abfragen mit Ansichten können READPAST verwenden, wenn der Hint für einen Korrelationsnamen angegeben ist, der eine Basistabelle bezeichnet. Die Verwendung des READPAST-Tabellen-Hints kann aufgrund der Interaktion von Sperren und Prädikatauswertungen im Server zu abnormalen Situationen führen. Außerdem können Sie den READPAST-Hint nicht mit Tabellen verwenden, die Ziel einer DELETE-, INSERT- oder UPDATE-Anweisung sind. |
READUNCOMMITTED | Setzt das Verhalten auf ein Äquivalent der Isolationsstufe 0. Dieser Tabellen-Hint ist synonym mit NOLOCK. |
REPEATABLEREAD | Setzt das Verhalten auf ein Äquivalent der Isolationsstufe 2. |
SERIALIZABLE | Setzt das Verhalten auf ein Äquivalent der Isolationsstufe 3. Dieser Tabellen-Hint ist synonym mit HOLDLOCK. |
UPDLOCK | Zeigt an, dass die von der Anweisung verarbeiteten Zeilen aus der Hint-Tabelle mit Absichtssperren gesperrt werden. Die betroffenen Zeilen bleiben bis zum Abschluss der Transaktion gesperrt. UPDLOCK gilt für alle Isolationsstufen und verwendet Absichtssperren. |
XLOCK | Zeigt an, dass die von der Anweisung verarbeiteten Zeilen aus der Hint-Tabelle exklusiv gesperrt werden müssen. Die betroffenen Zeilen bleiben bis zum Abschluss der Transaktion gesperrt. XLOCK gilt für alle Isolationsstufen und verwendet Schreibsperren. |
Wenn Sie Abfragen für Datenbanken schreiben, die an einer MobiLink-Synchronisation teilnehmen, wird empfohlen, dass Sie den READPAST-Tabellen-Hint nicht in Ihren Synchronisationsskripts verwenden.
Weitere Hinweise finden Sie unter:
Wenn Sie eine Verwendung von READPAST in Erwägung ziehen, weil Ihre Anwendung viele Aktualisierungen durchführt, die sich auf die Download-Performance auswirken, wäre die Verwendung der Snapshot-Isolation eine alternative Lösung.
Optimierungsziel-Tabellen-Hint (FASTFIRSTROW) Der Tabellen-Hint FASTFIRSTROW ermöglicht Ihnen die Einstellung des Optimierungsziels für die Abfrage, ohne die optimization_goal-Option auf First-row setzen zu müssen. Wenn Sie FASTFIRSTROW benutzen, wählt SQL Anywhere einen Zugriffsplan, der die Zeit für den Abruf der ersten Zeile in den Abfrageergebnissen reduzieren soll.
WITH ( index-hint )-Klausel Mit der Klausel WITH ( index-hint ) können Sie Index-Hints angeben, mit denen die Algorithmen für die Auswahl des Abfrageoptimiererplans außer Kraft gesetzt werden, und den Optimierer anweisen, wie über Indizes auf die Tabelle zugegriffen werden soll. Index-Hints können für Basistabellen, temporäre Tabellen und materialisierte Ansichten benutzt werden.
NO INDEX Verwenden Sie diese Klausel, um ein sequenzielles Durchsuchen der Tabelle zu erzwingen (Indizes werden nicht benutzt). Sequenzielles Durchsuchen kann sehr kostenaufwändig sein.
INDEX ( [ PRIMARY KEY | FOREIGN KEY ] index-name [,... ] ) Verwenden Sie diese Klausel, um bis zu vier Indizes anzugeben, die der Optimierer benutzen muss, um die Abfrage durchzuführen.
Wenn einer der angegebenen Indizes nicht verwendet werden kann, wird ein Fehler zurückgegeben.
Sie können PRIMARY KEY oder FOREIGN KEY angeben, um eine Mehrdeutigkeit in den Fällen auszuschließen, in denen der PRIMARY KEY-Index und der FOREIGN KEY-Index für eine Tabelle denselben Namen haben.
Wenn Sie im Index-Hint einen Indexnamen angeben, ohne den PRIMARY- oder FOREIGN-Schlüssel anzugeben, und mehrere Indizes mit demselben Namen für eine Tabelle existieren, wählt der Optimierer den normalen Index. Wenn ein normaler Index nicht vorhanden ist, wählt der Optimierer den Primärschlüsselindex. Wenn ein Primärschlüsselindex nicht existiert, wird anstelle dessen der Fremdschlüsselindex verwendet.
index-name kann durch die Angabe der Benutzer-ID und des Tabellennamens für den Index qualifiziert werden.
Die in der INDEX-Klausel angegebenen Indizes müssen für diese Tabelle definiert sein. Andernfalls wird ein Fehler zurückgegeben.
FROM Products WITH( INDEX (Products.xx))
gibt beispielsweis einen Fehler zurück, wenn der Index xx für die Tabelle Products nicht definiert ist. Und FROM Products WITH( INDEX (sales_order_items.sales_order_items))
gibt einen Fehler zurück, weil der Index sales_order_items.sales_order_items zwar vorhanden, aber nicht für die Tabelle Products
definiert ist.
INDEX ONLY { ON | OFF } Verwenden Sie diese Klausel, um zu steuern, ob ein reiner Indexabruf von Daten durchgeführt wird. Wenn die Klausel INDEX ( index-name... ) mit INDEX ONLY ON angegeben ist, versucht der Datenbankserver einen reinen Indexabruf mit den angegebenen Indizes. Wenn einer der angegebenen Indizes für eine reine Indexabfrage nicht benutzt werden kann, wird eine Fehlermeldung zurückgegeben (z.B. wenn keine Indizes vorhanden sind oder die bestehenden für die Abfrage nicht geeignet sind).
Geben Sie INDEX ONLY OFF an, um einen reinen Indexabruf zu verhindern.
FORCE INDEX ( index-name )
Die Syntax FORCE INDEX ( index-name ) wird aus Kompatibilitätsgründen bereitgestellt und kann nicht mehr als eine Indexbezeichnung aufnehmen. Diese Klausel ist
gleichwertig mit WITH ( INDEX ( index-name))
.
CLUSTERED INDEX Verwenden Sie diese Klausel, um anzugeben, dass der Optimierer einen Clustered-Index benutzen muss, falls einer vorhanden ist. Der Indexname wird nicht angegeben, weil nur ein Clustered-Index für eine Basistabelle vorhanden sein kann. Wenn ein Clustered-Index nicht existiert oder nicht verwendet werden kann, wird ein Fehler zurückgegeben.
Unterabfragen sind als Argumente für gespeicherte Prozeduren in der FROM-Klausel nicht zulässig. Die folgende Anweisung gibt z.B. einen Fehler zurück:
SELECT *, ( SELECT 12 x ) D FROM sa_rowgenerator( 1,( SELECT 12 x ) ): |
Die Anweisungen SELECT, UPDATE und DELETE erfordern eine Tabellenliste, um anzugeben, welche Tabellen von der Anweisung verwendet werden.
Obwohl sich die Beschreibung der FROM-Klausel auf Tabellen bezieht, gilt sie, sofern nicht anders angegeben, auch für Ansichten und abgeleitete Tabellen.
Die FROM-Klausel erstellt eine Ergebnismenge, die aus allen Spalten aller angegebenen Tabellen besteht. Anfänglich sind alle Zeilenkombinationen in den Komponententabellen in der Ergebnismenge enthalten, und die Anzahl der Kombinationen wird im Allgemeinen durch JOIN-Bedingungen bzw. WHERE-Klauseln verringert.
Es ist nicht möglich, eine ON-Klausel mit CROSS JOIN zu verwenden.
Die FILE-Klausel des openstring-expression erfordert DBA- oder READFILE-Datenbankberechtigungen.
Für die TABLE-Klausel von openstring-expression muss der Benutzer Eigentümer der angegebenen Tabelle sein oder SELECT-Berechtigungen dafür haben.
Keine.
SQL/2008 Die FROM-Klausel ist ein grundlegender Bestandteil des SQL/2008-Standards. Aufgrund der Komplexität der FROM-Klausel sollten Sie einzelne Komponenten einer FROM-Klausel anhand der entsprechenden Teile des Standards überprüfen. Im Folgenden finden Sie eine nicht vollständige Liste der optionalen SQL/2008-Sprachenfunktionen, die in SQL Anywhere unterstützt werden:
CROSS JOIN, FULL OUTER JOIN und NATURAL JOIN bilden die optionale SQL/2008-Funktion F401.
INTERSECT und INTERSECT ALL bilden die optionale SQL/2008-Funktion F302.
EXCEPT ALL ist die optionale Sprachenfunktion F304.
Abgeleitete Tabellen sind SQL/2008-Funktion F591.
Prozeduren in der FROM-Klausel (Tabellenfunktionen) sind Funktion T326. Beachten Sie, dass der SQL/2008-Standard das Schlüsselwort TABLE verlangt, um die Ausgabe einer Prozedur als Tabellenausdruck zu identifizieren, während in SQL Anywhere das TABLE-Schlüsselwort nicht erforderlich ist.
Allgemeine Tabellenausdrücke sind die optionale SQL/2008-Sprachenfunktion T121. Die Verwendung eines allgemeinen Tabellenausdrucks in einer abgeleiteten, in einem anderen allgemeinen Tabellenausdruck verschachtelten Tabelle ist Sprachenfunktion T122.
Rekursive Tabellenausdrücke sind Funktion T131. Die Verwendung eines rekursiven Tabellenausdrucks in einer abgeleiteten, in einem allgemeinen Tabellenausdruck verschachtelten Tabelle ist die optionale SQL/2008-Sprachenfunktion T132.
Die folgenden Komponenten der FROM-Klausel sind Erweiterungen des Herstellers:
KEY JOIN.
CROSS APPLY- und OUTER APPLY-Joins.
OPENSTRING.
table-expression mit CONTAINS (Volltextsuche).
Angabe einer dml-statement als abgeleitete Tabelle.
Alle Tabellen-Hints, einschließlich der Verwendung von WITH, FORCE INDEX und READPAST sowie Isolationsstufen-Hints.
LATERAL ( table-expression ) ist eine Erweiterung des Herstellers. LATERAL ( select-statement ) ist im SQL-Standard als optionale Sprachenfunktion T491 enthalten.
Die folgenden Klauseln sind gültige FROM-Klauseln:
... FROM Employees ... |
... FROM Employees NATURAL JOIN Departments ... |
... FROM Customers KEY JOIN SalesOrders KEY JOIN SalesOrderItems KEY JOIN Products ... |
... FROM Employees CONTAINS ( Street, ' Way ' ) ... |
Die folgende Abfrage veranschaulicht die Verwendung von abgeleiteten Tabellen in einer Abfrage:
SELECT Surname, GivenName, number_of_orders FROM Customers JOIN ( SELECT CustomerID, COUNT(*) FROM SalesOrders GROUP BY CustomerID ) AS sales_order_counts( CustomerID, number_of_orders ) ON ( Customers.ID = sales_order_counts.CustomerID ) WHERE number_of_orders > 3; |
Die folgende Abfrage veranschaulicht, wie Zeilen aus Ergebnismengen von gespeicherten Prozeduren ausgewählt werden.
SELECT t.ID, t.QuantityOrdered AS q, p.name FROM ShowCustomerProducts( 149 ) t JOIN Products p ON t.ID = p.ID; |
Das folgende Beispiel zeigt, wie eine Abfrage mit der OPENSTRING-Klausel ausgeführt wird, um eine Datei abzufragen. Die CREATE TABLE-Anweisung erstellt eine Tabelle namens testtable mit den zwei Spalten column1 und column2. Die UNLOAD-Anweisung erstellt eine Datei namens testfile.dat durch Entladen von Zeilen aus der Tabelle RowGenerator. Die SELECT-Anweisung verwendet die OPENSTRING-Klausel in einer FROM-Klausel, um eine Abfrage aus testfile.dat mit den Schemainformationen aus den Tabellen testtable und RowGenerator durchzuführen. Die Abfrage gibt eine Zeile mit dem Wert 49 zurück.
CREATE TABLE testtable( column1 CHAR(10), column2 INT ); UNLOAD SELECT * FROM RowGenerator TO 'testfile.dat'; SELECT A.column2 FROM OPENSTRING( FILE 'testfile.dat' ) WITH ( TABLE testtable( column2 ) ) A, RowGenerator B WHERE A.column2 = B.row_num AND A.column2 < 50 AND B.row_num > 48; |
Das folgende Beispiel zeigt, wie eine Abfrage mit der OPENSTRING-Klausel ausgeführt wird, um einen Zeichenfolgenwert abzufragen. Die SELECT-Anweisung verwendet die OPENSTRING-Klausel in einer FROM-Klausel, um einen Zeichenfolgenwert unter Verwendung der Schemainformationen abzurufen, die in der WITH-Klausel übergeben wurden. Die Abfrage gibt zwei Spalten mit drei Zeilen zurück.
SELECT * FROM OPENSTRING( VALUE '1,"First"$2,"Second"$3,"Third"') WITH (c1 INT, c2 VARCHAR(30)) OPTION ( DELIMITED BY ',' ROW DELIMITED BY '$') AS VALS |
Das folgende Beispiel zeigt die Durchführung einer Abfrage für die Auswahl der Zeilen, die durch eine Datenmanipulationsanweisung geändert wurden. In diesem Beispiel wird eine Warnung ausgegeben, wenn der Lagerbestand an blauen Artikeln um mehr als die Hälfte fällt.
SELECT old_products.name, old_products.quantity, final_products.quantity FROM ( UPDATE Products SET quantity = quantity - 10 WHERE color = 'Blue' ) REFERENCING ( OLD AS old_products FINAL AS final_products ) WHERE final_products.quantity < 0.5 * old_products.quantity; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |