Dela via


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 bara SELECT p.id FROM products p. p Här är aliaset för containern. Containern behöver inte nödvändigtvis namnges products eller p. 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 identifieraren products 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 egenskapen id inte är bunden. Frågan bör i stället referera till egenskapen id med hjälp av p.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_nameanvä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_nameanvä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 eller container_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"
  }
]