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 einfach SELECT p.id FROM products p. Hier ist p der Alias für den Container. Der Name des Containers muss nicht unbedingt products oder p 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 Bezeichner products 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 Eigenschaft id nicht gebunden ist. Die Abfrage sollte stattdessen mithilfe von p.id (oder <alias>.<property-name>) auf die Eigenschaft id 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.

Bemerkungen

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 oder container_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"
  }
]