Megosztás:


Azonosítók (Entity SQL)

Az entity SQL-ben az azonosítók a lekérdezési kifejezések aliasait, változóhivatkozásait, objektumtulajdonságait, függvényeit stb. jelölik. Az Entity SQL kétféle azonosítót biztosít: egyszerű azonosítókat és idézett azonosítókat.

Egyszerű azonosítók

Az Entity SQL egyszerű azonosítója alfanumerikus és aláhúzásjeles karakterek sorozata. Az azonosító első karakterének betűrendes karakternek (a-z vagy A-Z) kell lennie.

Idézett azonosítók

A idézett azonosító a szögletes zárójelekbe ([]) zárt karakterek sorozata. Az idézett azonosítók lehetővé teszik az azonosítókban érvénytelen karaktereket tartalmazó azonosítók megadását. A szögletes zárójelek közötti összes karakter az azonosító részévé válik, beleértve az összes szóközt is.

A idézett azonosítók nem tartalmazhatják a következő karaktereket:

  • Newline.

  • Kocsi visszatér.

  • Lapfülek.

  • Backspace.

  • További szögletes zárójelek (vagyis az azonosítót leíró szögletes zárójelek).

Az idézett azonosítók Unicode-karaktereket is tartalmazhatnak.

Az idézett azonosítók lehetővé teszik olyan tulajdonságnév-karakterek létrehozását, amelyek nem érvényesek az azonosítókban, ahogyan az az alábbi példában is látható:

SELECT c.ContactName AS [Contact Name] FROM customers AS c

Idézőjeles azonosítók használatával is megadhat egy olyan azonosítót, amely az Entity SQL fenntartott kulcsszója. Ha például a típus Email rendelkezik "From" nevű tulajdonságtal, szögletes zárójelek használatával egyértelműsítheti azt a FENNTARTOTT FROM kulcsszóból az alábbiak szerint:

SELECT e.[From] FROM emails AS e

A pont (.) operátor jobb oldalán idézőjeles azonosítót használhat.

SELECT t FROM ts as t WHERE t.[property] == 2

Ha a szögletes zárójelet egy azonosítóban szeretné használni, adjon hozzá egy további szögletes zárójelet. A következő példában a "abc]" az azonosító:

SELECT t from ts as t WHERE t.[abc]]] == 2

Az idézett azonosító-összehasonlító szemantikákért lásd a bemeneti karakterkészletet.

Aliasozási szabályok

Javasoljuk, hogy szükség esetén adjon meg aliasokat az Entity SQL-lekérdezésekben, beleértve a következő Entity SQL-szerkezeteket:

  • Sorkonstruktor mezői.

  • A lekérdezési kifejezés FROM záradékában szereplő elemek.

  • A lekérdezési kifejezés SELECT záradékában található elemek.

  • Egy lekérdezési kifejezés GROUP BY záradékának elemei.

Érvényes aliasok

Az Entity SQL érvényes aliasai bármilyen egyszerű azonosító vagy idézett azonosító.

Alias létrehozása

Ha nincs megadva alias egy Entity SQL-lekérdezési kifejezésben, az Entity SQL az alábbi egyszerű szabályok alapján próbál aliast létrehozni:

  • Ha a lekérdezési kifejezés (amelynek az aliasa nincs meghatározva) egy egyszerű vagy idézett azonosító, akkor a rendszer ezt az azonosítót használja aliasként. ROW(a, [b]) például ROW(a AS a, [b] AS [b])lesz.

  • Ha a lekérdezési kifejezés összetettebb kifejezés, de a lekérdezési kifejezés utolsó összetevője egy egyszerű azonosító, akkor a rendszer ezt az azonosítót használja aliasként. ROW(a.a1, b.[b1]) például ROW(a.a1 AS a1, b.[b1] AS [b1])lesz.

Javasoljuk, hogy ne használjon implicit aliast, ha később szeretné használni az aliasnevet. Amikor az aliasok (implicit vagy explicit) ütközést okoznak, vagy ugyanabban a hatókörben ismétlődnek, fordítási hiba lép fel. Az implicit alias akkor is átengedi a fordítást, ha az azonos nevű explicit vagy implicit alias szerepel.

Az implicit aliasok automatikusan jönnek létre a felhasználói bemenet alapján. Az alábbi kódsor például a NAME nevet fogja létrehozni mindkét oszlop aliasaként, ezért ütközik.

SELECT product.NAME, person.NAME

A következő kódsor, amely explicit aliasokat használ, szintén sikertelen lesz. A hiba azonban a kód beolvasásával nyilvánvalóbbá válik.

SELECT 1 AS X, 2 AS X …

Hatókörkezelési szabályok

Az Entity SQL olyan hatókörkezelési szabályokat határoz meg, amelyek meghatározzák, hogy egyes változók mikor láthatók a lekérdezési nyelven. Egyes kifejezések vagy utasítások új neveket vezetnek be. A hatókörkezelési szabályok határozzák meg, hogy hol használhatók ezek a nevek, és mikor vagy hol rejtheti el az elődjét egy másikkal azonos nevű új deklaráció.

Ha a nevek egy Entity SQL-lekérdezésben vannak definiálva, azt mondják, hogy egy hatókörön belül vannak definiálva. A hatókör a lekérdezés egy teljes régióját lefedi. Egy adott hatókörben lévő összes kifejezés vagy névhivatkozás láthatja az adott hatókörben definiált neveket. A hatókör kezdete és befejezése előtt a hatókörön belül definiált nevekre nem lehet hivatkozni.

A hatókörök beágyazhatók. Az Entity SQL egyes részei új hatóköröket vezetnek be, amelyek teljes régiókat fednek le, és ezek a régiók tartalmazhatnak más entitás SQL-kifejezéseket is, amelyek hatóköröket is bevezetnek. Ha a hatókörök beágyazottak, a hivatkozásokat tartalmazó legbelső hatókörben definiált nevekre lehet hivatkozni. A külső hatókörökben definiált nevekre is hivatkozhat. Az ugyanabban a hatókörben definiált két hatókör testvér hatókörnek minősül. A testvértartományokban definiált nevekre nem lehet hivatkozni.

Ha egy belső hatókörben deklarált név megegyezik egy külső hatókörben deklarált névvel, akkor a belső hatókörben vagy az adott hatókörben deklarált hatókörön belüli hivatkozások csak az újonnan deklarált névre vonatkoznak. A külső hatókörben lévő név rejtett.

Még ugyanazon a hatókörön belül sem lehet a nevekre hivatkozni a definiálásuk előtt.

A globális nevek a végrehajtási környezet részeként is létezhetnek. Ez tartalmazhat állandó gyűjtemények vagy környezeti változók nevét. Ahhoz, hogy egy név globális legyen, a legkülső hatókörben kell deklarálni.

A paraméterek nincsenek hatókörben. Mivel a paraméterekre mutató hivatkozások speciális szintaxist tartalmaznak, a paraméterek nevei soha nem ütköznek a lekérdezés többi nevével.

Lekérdezési kifejezések

Az Entity SQL lekérdezési kifejezés új hatókört vezet be. A FROM záradékban definiált nevek megjelenési sorrendben kerülnek a hatókörbe, balról jobbra. Az illesztéslistában a kifejezések a listában korábban definiált nevekre hivatkozhatnak. A FROM záradékban azonosított elemek nyilvános tulajdonságai (mezői stb.) nem lesznek hozzáadva a hatókörhöz. Az alias által minősített névnek mindig hivatkoznia kell rájuk. A SELECT kifejezés minden része általában a hatókörön belül van.

A GROUP BY záradék új testvértartományt is bevezet. Minden csoportnak lehet egy csoportneve, amely a csoport elemeinek gyűjteményére hivatkozik. Minden csoportosítási kifejezés új nevet is bevezet a csoport hatókörébe. Emellett a beágyazott aggregátum (vagy az elnevezett csoport) is hozzáadódik a hatókörhöz. Maguk a csoportosítási kifejezések a hatókörön belül vannak. A GROUP BY záradék használata esetén azonban a select-list (előrejelzés), a HAVING záradék és az ORDER BY záradék a csoport hatókörébe tartozik, nem pedig a hatókörön belülre. Az aggregátumok speciális kezelést kapnak, az alábbi felsorolásban leírtak szerint.

További megjegyzések a hatókörökről:

  • A kijelölési lista sorrendben új neveket is bevezethet a hatókörbe. A jobb oldali kivetítőkifejezések a bal oldalon kivetített nevekre hivatkozhatnak.

  • Az ORDER BY záradék a kiválasztási listában megadott nevekre (aliasokra) hivatkozhat.

  • A SELECT kifejezésben lévő záradékok kiértékelési sorrendje határozza meg a nevek hatókörbe való bevezetésének sorrendjét. A FROM záradékot először a WHERE záradék, a GROUP BY záradék, a HAVING záradék, a SELECT záradék és végül az ORDER BY záradék értékeli ki.

Összesítés kezelése

Az Entity SQL kétféle aggregátumot támogat: gyűjteményalapú összesítéseket és csoportalapú összesítéseket. A gyűjteményalapú aggregátumok az entity SQL által előnyben részesített szerkezetek, a csoportalapú összesítések pedig támogatottak az SQL-kompatibilitás szempontjából.

Az összesítés feloldásakor az Entity SQL először gyűjteményalapú összesítésként próbálja kezelni. Ha ez nem sikerül, az Entity SQL átalakítja az összesítő bemenetet a beágyazott aggregátumra mutató hivatkozássá, és megpróbálja feloldani ezt az új kifejezést az alábbi példában látható módon.

AVG(t.c) becomes AVG(group..(t.c))

Lásd még