Megosztás a következőn keresztül:


FROM záradék (NoSQL-lekérdezés)

A KÖVETKEZŐRE VONATKOZIK: NoSQL

A FROM (FROM <from_specification>) záradék nem kötelező, kivéve, ha a forrás szűrése vagy kivetítése a lekérdezés későbbi részében történik. Egy lekérdezés, például SELECT * FROM products egy teljes tárolón számbavételt ad, a névtől függetlenül. A tároló neve helyett használhatja a tároló speciális azonosítóját ROOT is.

A FROM záradék lekérdezésenként a következő szabályokat kényszeríti ki:

  • A tároló aliasos lehet, például SELECT p.id FROM products AS p vagy egyszerűen SELECT p.id FROM products p. p Itt található a tároló aliasa. A tárolónak nem feltétlenül kell nevet vagy nevet productspadni. ASaz azonosító aliasának megadása nem kötelező kulcsszó.
  • Az alias után az eredeti forrásnév nem kötött. Például szintaktikailag érvénytelen, SELECT products.id FROM products p mert az azonosító products aliasolva lett, és már nem oldható fel.
  • Minden hivatkozott tulajdonságnak teljes mértékben minősítettnek kell lennie, hogy ne legyenek egyértelmű kötések a szigorú sémamegtartás hiányában. Például szintaktikailag érvénytelen, SELECT id FROM products p mert a tulajdonság id nincs kötve. A lekérdezésnek ehelyett a tulajdonságra id kell hivatkoznia a (vagy<alias>.<property-name>) használatával p.id .

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

Argumentumok

Leírás
<from_source> Egy adatforrást határoz meg aliassal vagy anélkül. Ha nincs megadva alias, a következő szabályokból következtetünk <container_expression> rá. Ha a kifejezés egy container_name, akkor container_name a rendszer aliasként használja. Ha a kifejezés az <container_expression>, akkor property_name a rendszer aliasként használja. Ha a kifejezés egy container_name, akkor container_name a rendszer aliasként használja.
AMINT input_alias Megadja, hogy a input_alias mögöttes tárolókifejezés által visszaadott értékek halmaza.
input_alias BAN Megadja, hogy az input_alias értékhalmaz az alapul szolgáló tárolókifejezés által visszaadott tömbök összes tömbelemére való iterálással kapott értékhalmazt adja meg. A rendszer figyelmen kívül hagyja az alapul szolgáló tárolókifejezés által visszaadott értékeket, amelyek nem tömbök.
<container_expression> Megadja az elemek lekéréséhez használandó tárolókifejezést.
ROOT Megadja, hogy az elemet az alapértelmezett, jelenleg csatlakoztatott tárolóból kell lekérni.
container_name Megadja, hogy az elemet le kell kérni a megadott tárolóból. A tároló nevének meg kell egyeznie a jelenleg csatlakoztatott tároló nevével.
input_alias Megadja, hogy az elemet a megadott alias által definiált másik forrásból kell lekérni.
<container_expression> '.' property_name Megadja, hogy az elemet a tulajdonság elérésével property_name kell lekérni.
<container_expression> '[' "property_name" \| array_index ']' Megadja, hogy az elemet a megadott tárolókifejezés által lekért összes elem tulajdonságához vagy array_index tömbeleméhez való hozzáféréssel property_name kell lekérni.

Megjegyzések

Az (s) pontban <from_source>megadott vagy kikövetkeztetett összes aliasnak egyedinek kell lennie. A szintaxis <container_expression> '.' property_name megegyezik <container_expression> '[' "property_name" ']'a . Az utóbbi szintaxis azonban akkor használható, ha egy tulajdonságnév egy nonidentifier karaktert tartalmaz.

Hiányzó tulajdonságok, hiányzó tömbelemek és nem definiált értékek kezelése

Ha egy tárolókifejezés hozzáfér a tulajdonságokhoz vagy tömbelemekhez, és ez az érték nem létezik, a rendszer figyelmen kívül hagyja az értéket, és nem dolgozza fel tovább.

Tárolókifejezés környezetének hatókörkezelése

A tárolókifejezések tárolóhatókörrel vagy elemhatókörrel is rendelkezhetnek:

  • A kifejezés tárolóhatókörű, ha a tárolókifejezés mögöttes forrása vagy ROOTcontainer_name. Az ilyen kifejezések a tárolóból közvetlenül lekért elemek készletét jelölik, és nem függnek más tárolókifejezések feldolgozásától.

  • Egy kifejezés elemhatókörű, ha a tárolókifejezés mögöttes forrása a lekérdezés korábbi szakaszában van input_alias bevezetve. Az ilyen kifejezés a tárolókifejezés kiértékelésével beszerzett elemek halmazát jelöli. Ez a kiértékelés az aliasos tárolóhoz társított készlethez tartozó egyes elemek hatókörében történik. Az eredményként kapott halmaz a készletek egysége, amelyet a tárolókifejezés kiértékelésével kapunk az alapul szolgáló készlet minden egyes eleméhez.

Példák

Ebben az első példában a záradék az FROM aktuális tároló forrásként való megadására, egyedi név megadására, majd alias megadására szolgál. Az alias ezután a lekérdezés eredményeinek adott mezőinek kivetítésére szolgál.

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

Ebben a következő példában a FROM záradék kisebb részhalmazra is csökkentheti a forrást. Ha az egyes elemekben csak egy részhalmazt szeretne számba adni, az alrész lehet a forrás. Forrásként tömb- vagy objektumalkotó is használható.

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