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 Tabellenausdruck, ...
Tabellenausdruck : Tabellenname | Ansichtsname | Prozedurname | Abgeleitete_Tabelle | Lateral_abgeleitete_Tabelle | Join-Ausdruck | ( Tabellenausdruck, ... ) | Openstring-Ausdruck | Apply-Ausdruck | Contains-Ausdruck | Abgeleitete_DML-Tabelle
Tabellenname : [ Benutzer-ID.]Tabellenname ] [ [ AS ] Korrelationsname ] [ WITH ( Hint [...] ) ] [ FORCE INDEX ( Indexname ) ]
Ansichtsname : [ Benutzer-ID.] Ansichtsname [ [ AS ] Korrelationsname ] [ WITH ( Tabellen-Hint ) ]
Prozedurname : [ Eigentümer.]Prozedurname ( [ Parameter, ... ] ) [ WITH ( Spaltenname Datentyp, ... ) ] [ [ AS ] Korrelationsname ]
Abgeleitete_Tabelle : ( Select-Anweisung ) [ AS ] Korrelationsname [ ( Spaltenname, ... ) ]
Lateral_abgeleitete_Tabelle : LATERAL ( Select-Anweisung | Tabellenausdruck ) [ AS ] Korrelationsname [ ( Spaltenname, ... ) ]
Join-Ausdruck :
Tabellenausdruck Join-Operator Tabellenausdruck
[ ON Join-Bedingung ]
Join-Operator: [ KEY | NATURAL ] [ Join-Typ ] JOIN | CROSS JOIN
Join-Typ: INNER | LEFT [ OUTER ] | RIGHT [ OUTER ] | FULL [ OUTER ]
Hint : Tabellen-Hint | Index-Hint
Tabellen-Hint: READPAST | UPDLOCK | XLOCK | FASTFIRSTROW | HOLDLOCK | NOLOCK | READCOMMITTED | READUNCOMMITTED | REPEATABLEREAD | SERIALIZABLE
Index-Hint : NO INDEX | INDEX ( [ PRIMARY KEY | FOREIGN KEY ] Indexname [, ...] ) [ INDEX ONLY { ON | OFF } ]
Openstring-Ausdruck : OPENSTRING ( { FILE | VALUE } Zeichenfolgenausdruck ) WITH ( Rowset-Schema ) [ OPTION ( Scan-Option ... ) ] [ AS ] Korrelationsname
APPLY-Ausdruck : Tabellenausdruck { CROSS | OUTER } APPLY Tabellenausdruck
Contains-Ausdruck : {Tabellenname | Ansichtname } CONTAINS ( Spaltenname [,...], Contains-Abfrage ) [ [ AS ] Score-Korrelationsname ]
Rowset-Schema : Spaltenschemaliste | TABLE [Eigentümer.]Tabellenname [ ( Spaltenliste ) ]
Spaltenschemaliste :
{ Spaltenname Benutzer-oder-Basis-Typ | filler( ) } [ , ... ]
Spaltenliste :
{ Spaltenname | filler( ) } [ , ... ]
Scan-Option : BYTE ORDER MARK { ON | OFF } | COMMENTS INTRODUCED BY Kommentarpräfix | DELIMITED BY Zeichenfolge | ENCODING Kodierung | ESCAPE CHARACTER Zeichen | ESCAPES { ON | OFF } | FORMAT { TEXT | BCP | HEXADECIMAL { ON | OFF } | QUOTE Zeichenfolge | QUOTES { ON | OFF } | ROW DELIMITED BY Zeichenfolge | SKIP Ganzzahl | STRIP { ON | OFF | LTRIM | RTRIM | BOTH }
CONTAINS-Abfrage : Zeichenfolge
abgeleitete_DML-Tabelle : ( DML-Anweisung ) REFERENCING ( [ Tabellenversionsnamen | NONE ] )
DML-Anweisung : INSERT-Anweisung DELETE-Anweisung UPDATE-Anweisung MERGE-Anweisung
Tabellenversionsnamen : OLD [ AS ] Korrelationsname [ FINAL [ AS ] Korrelationsname ] | FINAL [ AS ] Korrelationsname
Tabellenname 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 (siehe Bezugnahme auf Tabellen, deren Eigentümer Gruppen sind).
Ansichtsname 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.
Prozedurname 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. 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; |
Wenn Sie eine Prozedur ohne RESULT-Klausel erstellen und die Prozedur eine variablen 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.
Abgeleitete_Tabelle 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; |
Weitere Hinweise zu abgeleiteten Tabellen finden Sie unter Abgeleitete Tabellen abfragen.
Lateral_abgeleitete_Tabelle 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 ) ) LDT; |
SELECT * FROM A, LATERAL( SELECT * FROM B WHERE A.x = B.x ) LDT; |
SELECT * FROM A, LATERAL( Prozedurname( A.x ) ) LDT; |
Die Angabe von LATERAL ( Tabellenausdruck) ist zur Angabe von LATERAL ( SELECT * FROM Tabellenausdruck ) äquivalent.
Openstring-Ausdruck 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. Siehe Unterstützung von ESRI-Formdateien.
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) )
). Weitere Hinweise zur Verwendung von filler( ) finden Sie unter LOAD TABLE-Anweisung.
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. Siehe LOAD TABLE-Anweisung.
Scan-Option Beschreibungen der einzelnen Scan-Optionen finden Sie bei den Ladeoptionen, die unter LOAD TABLE-Anweisung beschrieben werden.
Apply-Ausdruck Verwenden Sie diese Klausel, um eine Join-Bedingung anzugeben, in der der rechte Tabellenausdruck für jede Zeile im linken Tabellenausdruck 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. Siehe Joins, die sich aus APPLY-Ausdrücken ergeben.
Contains-Ausdruck 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-Abfrage eingegeben haben. Jede übereinstimmende Zeile der Tabelle wird gemeinsam mit einer Score-Spalte zurückgegeben, die mit Score-Korrelationsname referenziert werden kann, wenn dieser angegeben ist. Wenn Score-Korrelationsname 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. Siehe CONTAINS-Suchbedingung.
Es muss ein Textindex für die Spalten vorhanden sein, die in der CONTAINS-Klausel aufgelistet sind. Siehe Textindizes verwalten.
Die CONTAINS-Abfrage darf nicht NULL oder eine leere Zeichenfolge sein. Wenn die Textkonfigurationseinstellungen das Löschen aller Begriffe in der CONTAINS-Abfrage bewirken, werden Zeilen aus der vom CONTAINS-Ausdruck referenzierten Basistabelle nicht zurückgegeben. Weitere Hinweise zu Einstellungen für das Textkonfigurationsobjekt finden Sie unter Einstellungen für Textkonfigurationsobjekte. Weitere Hinweise zur Interpretation der CONTAINS-Abfragezeichenfolge finden Sie unter Beispiel-Textkonfigurationsobjekte.
Korrelationsname Verwenden Sie Korrelationsname, 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-Anweisung Verwenden Sie DML-Anweisung 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 abgeleitete_DML-Tabelle 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 abgeleitete_DML-Tabelle.
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 abgeleitete_DML-Tabelle 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-Anweisung 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 abgeleitete_DML-Tabelle-Anweisung kann nur eine aktualisierbare Tabelle referenzieren. Bei Aktualisierungen über mehrere Tabellen wird ein Fehler zurückgegeben. Darüber hinaus ist eine Auswahl aus DML-Anweisung nicht zulässig, wenn die DML-Anweisung in einer korrelierten Unterabfrage oder einem allgemeinen Tabellenausdruck erscheint, weil die Semantik dieser Konstrukte unklar sein kann.
Weitere Hinweise finden Sie unter Eine SELECT-Anweisung über eine DML-Anweisung ausführen und Anweisungen für die Datenänderung.
WITH Tabellen-Hint-Klausel Mit der Klausel WITH Tabellen-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 Tabellen-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. Siehe 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. Siehe Schreibsperren. |
Hinweise zu Isolationsstufen finden Sie unter Isolationsstufen und Konsistenz.
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. Siehe MobiLink-Isolationsstufen.
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. Siehe optimization_goal-Option.
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 kostenaufwendig sein.
INDEX ( [ PRIMARY KEY | FOREIGN KEY ] Indexname [,... ] ) 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.
Indexname 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 ( Indexname... ) 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 ( Indexname ) Die Syntax FORCE INDEX ( Indexname ) wird aus Kompatibilitätsgründen bereitgestellt und kann nicht mehr als eine Indexbezeichnung aufnehmen. Verwenden Sie diese Klausel, um den Index anzugeben, den der Optimierer verwenden muss, um in der Tabelle Zeilen zu finden, die für die Abfrage geeignet sind.
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-Ausdrucks erfordert DBA- oder READFILE-Datenbankberechtigungen.
Für die TABLE-Klausel von Openstring-Ausdruck 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.
Tabellenausdruck mit CONTAINS (Volltextsuche).
Angabe einer DML-Anweisung als abgeleitete Tabelle.
Alle Tabellen-Hints, einschließlich der Verwendung von WITH, FORCE INDEX und READPAST sowie Isolationsstufen-Hints.
LATERAL ( Tabellenausdruck ) ist eine Erweiterung des Herstellers. LATERAL ( SELECT-Anweisung ) 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 Datenänderungsanweisung 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 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |