Udostępnij za pośrednictwem


KLAUZULA FROM (zapytanie NoSQL)

DOTYCZY: NoSQL

Klauzula FROM (FROM <from_specification>) jest opcjonalna, chyba że źródło jest filtrowane lub przewidywane później w zapytaniu. Zapytanie, takie jak SELECT * FROM products wylicza cały kontener, niezależnie od nazwy. Można również użyć specjalnego identyfikatora ROOT dla kontenera zamiast nazwy kontenera.

Klauzula FROM wymusza następujące reguły na zapytanie:

  • Kontener może mieć alias, taki jak SELECT p.id FROM products AS p lub po prostu SELECT p.id FROM products p. p W tym miejscu znajduje się alias kontenera. Kontener nie musi mieć nazwy products ani p. AS jest opcjonalnym słowem kluczowym do aliasu identyfikatora.
  • Po utworzeniu aliasu nie można powiązać oryginalnej nazwy źródłowej. Na przykład składniowo jest nieprawidłowy, SELECT products.id FROM products p ponieważ identyfikator products został aliasowany i nie można go już rozpoznać.
  • Wszystkie przywoływalne właściwości muszą być w pełni kwalifikowane, aby uniknąć niejednoznacznych powiązań w przypadku braku ścisłego przestrzegania schematu. Na przykład składniowo jest nieprawidłowa, SELECT id FROM products p ponieważ właściwość id nie jest powiązana. Zapytanie powinno zamiast tego odwoływać się do właściwości id przy użyciu metody p.id (lub <alias>.<property-name>).

Składnia

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 ']'

Argumenty

opis
<from_source> Określa źródło danych z aliasem lub bez tego aliasu. Jeśli alias nie zostanie określony, zostanie on wywnioskowany z <container_expression> następujących reguł. Jeśli wyrażenie jest wyrażeniem container_name, container_name zostanie użyte jako alias. Jeśli wyrażenie ma <container_expression>wartość , property_name zostanie użyte jako alias. Jeśli wyrażenie jest wyrażeniem container_name, container_name zostanie użyte jako alias.
GDY input_alias Określa, że input_alias jest zestawem wartości zwracanych przez bazowe wyrażenie kontenera.
input_alias W Określa, że input_alias element powinien reprezentować zestaw wartości uzyskanych przez iterację wszystkich elementów tablicy każdej tablicy zwracanej przez bazowe wyrażenie kontenera. Każda wartość zwracana przez bazowe wyrażenie kontenera, które nie jest tablicą, jest ignorowana.
<container_expression> Określa wyrażenie kontenera, które ma być używane do pobierania elementów.
ROOT Określa, że element powinien zostać pobrany z domyślnego, aktualnie połączonego kontenera.
container_name Określa, że element powinien zostać pobrany z dostarczonego kontenera. Nazwa kontenera musi być zgodna z nazwą aktualnie połączonego kontenera.
input_alias Określa, że element powinien zostać pobrany z innego źródła zdefiniowanego przez podany alias.
<container_expression> '.' property_name Określa, że element powinien zostać pobrany przez uzyskanie property_name dostępu do właściwości.
<container_expression> '[' "property_name" \| array_index ']' Określa, że element powinien zostać pobrany przez uzyskanie property_name dostępu do właściwości lub array_index elementu tablicy dla wszystkich elementów pobranych przez określone wyrażenie kontenera.

Uwagi

Wszystkie aliasy podane lub wywnioskowane w <from_source>(s) muszą być unikatowe. Składnia <container_expression> '.' property_name jest taka sama jak <container_expression> '[' "property_name" ']'. Tę drugą składnię można jednak użyć, jeśli nazwa właściwości zawiera znak nieidentyfikatora.

Obsługa brakujących właściwości, brakujących elementów tablicy i niezdefiniowanych wartości

Jeśli wyrażenie kontenera uzyskuje dostęp do właściwości lub elementów tablicy i ta wartość nie istnieje, ta wartość jest ignorowana i nie jest przetwarzana dalej.

Określanie zakresu kontekstu wyrażenia kontenera

Wyrażenie kontenera może mieć zakres kontenera lub zakres elementu:

  • Wyrażenie jest ograniczone do zakresu kontenera, jeśli bazowe źródło wyrażenia kontenera to ROOT lub container_name. Takie wyrażenie reprezentuje zestaw elementów pobranych bezpośrednio z kontenera i nie zależy od przetwarzania innych wyrażeń kontenera.

  • Wyrażenie jest ograniczone do zakresu elementów, jeśli bazowe źródło wyrażenia kontenera zostanie input_alias wprowadzone wcześniej w zapytaniu. Takie wyrażenie reprezentuje zestaw elementów uzyskanych przez ocenę wyrażenia kontenera. Ta ocena jest wykonywana w zakresie każdego elementu należącego do zestawu skojarzonego z kontenerem aliasu. Zestaw wynikowy jest związkiem zestawów uzyskanych przez ocenę wyrażenia kontenera dla każdego z elementów w zestawie bazowym.

Przykłady

W tym pierwszym przykładzie klauzula FROM służy do określania bieżącego kontenera jako źródła, nadania mu unikatowej nazwy, a następnie aliasu. Alias jest następnie używany do projekcji określonych pól w wynikach zapytania.

SELECT VALUE {
    name: e.name,
    location: e.workLocation
}
FROM
    employees e
[
  {
    "name": "Tijana Stanković",
    "location": {
      "office": "Redmond, WA"
    }
  },
  {
    "name": "Jean Nadeau",
    "location": {
      "type": "Remote"
    }
  }
]

W następnym przykładzie klauzula FROM może również zmniejszyć źródło do mniejszego podzestawu. Aby wyliczyć tylko poddrzewo w każdym elemencie, podroot może stać się źródłem. Jako źródło można użyć tablicy lub podrootu obiektu.

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