FROM-Klausel (NoSQL-Abfrage)
GILT FÜR: NoSQL
Die FROM-Klausel (FROM <from_specification>
) ist optional, es sei denn, die Quelle wird später in der Abfrage gefiltert oder projiziert. Eine Abfrage wie SELECT * FROM products
listet einen gesamten Container auf – unabhängig von dessen Namen. Sie können auch den speziellen Bezeichner ROOT
für den Container statt des Containernamens verwenden.
Die FROM
-Klausel erzwingt die folgenden Regeln pro Abfrage:
- Der Container kann Aliase enthalten, z.B.
SELECT p.id FROM products AS p
oder einfachSELECT p.id FROM products p
. Hier istp
der Alias für den Container. Der Name des Containers muss nicht unbedingtproducts
oderp
lauten.AS
ist ein optionales Schlüsselwort, das als Alias für den Bezeichner fungiert. - Sobald ein Alias verwendet wurde, kann der Name der Originalquelle nicht mehr gebunden werden.
SELECT products.id FROM products p
ist beispielsweise syntaktisch ungültig, da der Bezeichnerproducts
durch einen Alias ersetzt wurde und nicht mehr aufgelöst werden kann. - Alle referenzierten Eigenschaften müssen vollqualifiziert sein, um bei Fehlen einer strikten Schemaverwendung mehrdeutige Bindungen zu vermeiden. Beispielsweise ist
SELECT id FROM products p
syntaktisch ungültig, da die Eigenschaftid
nicht gebunden ist. Die Abfrage sollte stattdessen mithilfe vonp.id
(oder<alias>.<property-name>
) auf die Eigenschaftid
verweisen.
Syntax
FROM <from_specification>
<from_specification> ::=
<from_source> {[ JOIN <from_source>][,...n]}
<from_source> ::=
<container_expression> [[AS] input_alias]
| input_alias IN <container_expression>
<container_expression> ::=
ROOT
| container_name
| input_alias
| <container_expression> '.' property_name
| <container_expression> '[' "property_name" | array_index ']'
Argumente
Beschreibung | |
---|---|
<from_source> |
Gibt eine Datenquelle mit oder ohne Alias an. Wenn der Alias nicht angegeben wurde, wird er mithilfe der folgenden Regeln aus dem <container_expression> (Containerausdruck) abgeleitet. Wenn der Ausdruck ein container_name (Containername) ist, wird container_name als Alias verwendet. Wenn der Ausdruck ein <container_expression> (Containerausdruck) ist, wird property_name als Alias verwendet. Wenn der Ausdruck ein container_name (Containername) ist, wird container_name als Alias verwendet. |
AS input_alias |
Gibt an, dass input_alias ein Satz von Werten ist, die von dem zugrunde liegenden Containerausdruck zurückgegeben werden. |
input_alias IN |
Gibt an, dass input_alias den Satz von Werten darstellen soll, die durch Iteration in allen Arrayelementen jedes Arrays gewonnen wurden, das vom zugrunde liegenden Containerausdruck zurückgegeben werden. Jeder vom zugrunde liegenden Containerausdruck zurückgegebene Wert, der kein Array ist, wird ignoriert. |
<container_expression> |
Gibt den Containerausdruck an, der zum Abrufen der Elemente verwendet werden soll. |
ROOT |
Gibt an, dass das Element aus dem standardmäßigen, zurzeit verbundenen Container abgerufen werden sollte. |
container_name |
Gibt an, dass das Element aus dem bereitgestellten Container abgerufen werden sollte. Der Name des Containers muss mit dem Namen des aktuell verbundenen Containers übereinstimmen. |
input_alias |
Gibt an, dass das Element aus der anderen, durch den bereitgestellten Alias definierten Quelle abgerufen werden sollte. |
<container_expression> '.' property_name |
Gibt an, dass das Element durch Zugriff auf die Eigenschaft property_name abgerufen werden sollte. |
<container_expression> '[' "property_name" \| array_index ']' |
Gibt an, dass das Element durch Zugriff auf die Eigenschaft property_name oder das Arrayelement array_index für alle Elemente abgerufen werden sollte, die durch den angegebenen Containerausdruck abgerufen werden. |
Hinweise
Alle in den <from_source>
(s) bereitgestellten oder abgeleiteten Aliase müssen eindeutig sein. Die Syntax <container_expression> '.' property_name
ist die gleiche wie bei <container_expression> '[' "property_name" ']'
. Die letztgenannte Syntax kann jedoch verwendet werden, wenn ein Eigenschaftenname ein Nicht-ID-Zeichen enthält.
Behandeln fehlender Eigenschaften, fehlender Arrayelemente und undefinierter Werte
Wenn ein Containerausdruck auf Eigenschaften oder Arrayelemente zugreift und dieser Wert nicht vorhanden ist, wird er ignoriert und nicht weiterverarbeitet.
Kontextbereich des Containerausdrucks
Ein Containerausdruck kann container- oder elementbezogen sein:
Ein Ausdruck ist containerbezogen, wenn die zugrunde liegende Quelle des Containerausdrucks entweder
ROOT
odercontainer_name
lautet. Ein solcher Ausdruck stellt eine Reihe von Elementen dar, die direkt aus dem Container abgerufen werden, und ist von der Verarbeitung anderer Containerausdrücke nicht abhängig.Ein Ausdruck ist elementbezogen, wenn die zugrunde liegende Quelle des Containerausdrucks
input_alias
lautet und zuvor in der Abfrage eingeführt wurde. Ein solcher Ausdruck stellt eine Reihe von Elementen dar, die durch Auswerten des Containerausdrucks abgerufen werden. Diese Auswertung erfolgt im Bereich jedes Elements, das zu der dem Alias-Container zugeordneten Gruppe gehört. Das Resultset ist eine Vereinigung von Sätzen, die durch Auswerten des Containerausdrucks für jedes der Elemente im zugrunde liegenden Satz abgerufen werden.
Beispiele
In diesem ersten Beispiel wird die FROM
-Klausel verwendet, um den aktuellen Container als Quelle anzugeben, ihm einen eindeutigen Namen zu geben und ihn dann als Alias zu verwenden. Der Alias wird dann zum Projizieren von bestimmten Feldern in den Abfrageergebnissen verwendet.
SELECT VALUE {
name: e.name,
location: e.workLocation
}
FROM
employees e
[
{
"name": "Tijana Stanković",
"location": {
"office": "Redmond, WA"
}
},
{
"name": "Jean Nadeau",
"location": {
"type": "Remote"
}
}
]
In diesem nächsten Beispiel kann die FROM
-Klausel auch die Quelle auf eine kleinere Teilmenge verringern. Wenn nur eine Teilstruktur in jedem Element aufgelistet werden soll, kann der Unterstamm zur Quelle werden. Ein Array- oder Objektunterstamm kann als Quelle verwendet werden.
SELECT
*
FROM
employees.employment e
[
{
"hireDateTime": "2023-01-01T06:30:00.000Z",
"weeklyHours": 40,
"team": "Retail support"
},
{
"hireDateTime": "2023-01-01T09:30:00.000Z",
"team": "Retail support"
},
{
"hireDateTime": "2023-01-01T15:30:00.000Z",
"weeklyHours": 32,
"team": "Retail support"
}
]