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 prostuSELECT p.id FROM products p
.p
W tym miejscu znajduje się alias kontenera. Kontener nie musi mieć nazwyproducts
anip
.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ż identyfikatorproducts
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ściid
przy użyciu metodyp.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
lubcontainer_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"
}
]