FROM-sats (NoSQL-fråga)
GÄLLER FÖR: NoSQL
FROM-satsen (FROM <from_specification>
) är valfri, såvida inte källan filtreras eller projiceras senare i frågan. En fråga som SELECT * FROM products
räknas upp över en hel container oavsett namn. Du kan också använda den särskilda identifieraren ROOT
för containern i stället för att använda containernamnet.
Satsen FROM
tillämpar följande regler per fråga:
- Containern kan vara ett alias, till exempel
SELECT p.id FROM products AS p
eller baraSELECT p.id FROM products p
.p
Här är aliaset för containern. Containern behöver inte nödvändigtvis namngesproducts
ellerp
.AS
är ett valfritt nyckelord för att ge identifieraren alias . - När det ursprungliga källnamnet har aliaserats kan det inte bindas. Är till exempel
SELECT products.id FROM products p
syntaktiskt ogiltigt eftersom identifierarenproducts
har aliaserats och inte längre kan matchas. - Alla refererade egenskaper måste vara fullständigt kvalificerade för att undvika tvetydiga bindningar i avsaknad av strikt schemaefterlevnad. Är till exempel
SELECT id FROM products p
syntaktiskt ogiltigt eftersom egenskapenid
inte är bunden. Frågan bör i stället referera till egenskapenid
med hjälp avp.id
(eller<alias>.<property-name>
).
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 ']'
Argument
beskrivning | |
---|---|
<from_source> |
Anger en datakälla, med eller utan ett alias. Om alias inte anges härleds det från <container_expression> följande regler. Om uttrycket är ett container_name används det container_name som ett alias. Om uttrycket är <container_expression> används det property_name som ett alias. Om uttrycket är ett container_name används det container_name som ett alias. |
SOM input_alias |
Anger att är en uppsättning värden som input_alias returneras av det underliggande containeruttrycket. |
input_alias I |
Anger att ska representera den uppsättning värden som input_alias erhålls genom iterering över alla matriselement i varje matris som returneras av det underliggande containeruttrycket. Alla värden som returneras av underliggande containeruttryck som inte är en matris ignoreras. |
<container_expression> |
Anger det containeruttryck som ska användas för att hämta objekten. |
ROOT |
Anger att objektet ska hämtas från den för närvarande anslutna standardcontainern. |
container_name |
Anger att objektet ska hämtas från den angivna containern. Namnet på containern måste matcha namnet på den container som för närvarande är ansluten till. |
input_alias |
Anger att objektet ska hämtas från den andra källan som definieras av det angivna aliaset. |
<container_expression> '.' property_name |
Anger att objektet ska hämtas genom åtkomst property_name till egenskapen. |
<container_expression> '[' "property_name" \| array_index ']' |
Anger att objektet ska hämtas genom att property_name komma åt egenskapen eller array_index matriselementet för alla objekt som hämtas av det angivna containeruttrycket. |
Kommentarer
Alla alias som anges eller härleds i <from_source>
(s) måste vara unika. Syntaxen <container_expression> '.' property_name
är densamma som <container_expression> '[' "property_name" ']'
. Den senare syntaxen kan dock användas om ett egenskapsnamn innehåller ett tecken som inte är identifierare.
Hantera saknade egenskaper, saknade matriselement och odefinierade värden
Om ett containeruttryck kommer åt egenskaper eller matriselement och det värdet inte finns ignoreras det värdet och bearbetas inte ytterligare.
Kontextomfång för containeruttryck
Ett containeruttryck kan vara containeromfattande eller objektomfångsbegränsat:
Ett uttryck är containeromfång, om den underliggande källan för containeruttrycket är antingen
ROOT
ellercontainer_name
. Ett sådant uttryck representerar en uppsättning objekt som hämtats direkt från containern och är inte beroende av bearbetningen av andra containeruttryck.Ett uttryck är objektomfångat, om den underliggande källan för containeruttrycket
input_alias
introduceras tidigare i frågan. Ett sådant uttryck representerar en uppsättning objekt som hämtas genom att utvärdera containeruttrycket. Den här utvärderingen utförs i omfånget för varje objekt som tillhör uppsättningen som är associerad med den aliaserade containern. Den resulterande uppsättningen är en union av uppsättningar som hämtas genom att utvärdera containeruttrycket för vart och ett av objekten i den underliggande uppsättningen.
Exempel
I det här första exemplet FROM
används -satsen för att ange den aktuella containern som en källa, ge den ett unikt namn och sedan alias det. Aliaset används sedan för att projicera specifika fält i frågeresultatet.
SELECT VALUE {
name: e.name,
location: e.workLocation
}
FROM
employees e
[
{
"name": "Tijana Stanković",
"location": {
"office": "Redmond, WA"
}
},
{
"name": "Jean Nadeau",
"location": {
"type": "Remote"
}
}
]
I nästa exempel FROM
kan satsen också minska källan till en mindre delmängd. Om du bara vill räkna upp ett underträd i varje objekt kan underroten bli källan. En matris eller objektunderrot kan användas som källa.
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"
}
]