Névfeloldás

A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet Databricks Runtime

A névfeloldás az a folyamat, amellyel az azonosítók adott oszlop-, mező-, paraméter- vagy táblahivatkozásokra lesznek feloldva.

Oszlop, mező, paraméter és változófelbontás

A kifejezések azonosítói az alábbiak bármelyikére hivatkozhatnak:

  • Oszlopnév nézet, táblázat, közös táblakifejezés (CTE) vagy column_alias alapján.
  • Mezőnév vagy térképkulcs egy struccban vagy térképen belül. A mezők és kulcsok soha nem minősíthetők.
  • Felhasználó által definiált SQL-függvény paraméterneve.
  • Változó neve.
  • Egy speciális függvény, például current_usercurrent_date vagy amely nem követeli ()meg a használatát.
  • Az DEFAULT a kulcsszó, amely a , , UPDATE, MERGESET VARIABLE vagy egy oszlop vagy változó értékének INSERTalapértelmezett értékére van állítva.

A névfeloldás a következő alapelveket alkalmazza:

  • A legközelebbi egyező hivatkozás nyer, és
  • Oszlopok és paraméterek nyernek a mezők és kulcsok felett.

Az azonosítók egy adott hivatkozásra történő feloldása a következő szabályok szerint történik:

  1. Helyi hivatkozások

    1. Oszlophivatkozás

      Egyezzen a minősíthető azonosítóval a tábla hivatkozásábanFROM clauseszereplő oszlopnévvel.

      Ha egynél több ilyen egyezés van, AMBIGUOUS_COLUMN_OR_FIELD hibát jelez.

    2. Paraméter nélküli függvényhivatkozás

      Ha az azonosító nem minősített, és megegyezik current_user, current_datevagy current_timestamp: Oldja fel a függvények egyikeként.

    3. Oszlop ALAPÉRTELMEZETT specifikációja

      Ha az azonosító nem minősített, egyezik default a teljes kifejezéssel UPDATE SETegy , INSERT VALUESvagy MERGE WHEN [NOT] MATCHED: Feloldás a céltábla INSERTmegfelelő DEFAULT értékeként az , UPDATE vagy MERGE.

    4. Strukturálási mező vagy térképkulcs referenciája

      Ha az azonosító minősített, az alábbi lépéseknek megfelelően törekedjen egy mező vagy térképkulcs egyeztetésére:

      V. Távolítsa el az utolsó azonosítót, és kezelje mezőként vagy kulcsként. B. A fennmaradó rész egy oszlophoz való egyeztetése a táblahivatkozásban.FROM clause

      Ha egynél több ilyen egyezés van, AMBIGUOUS_COLUMN_OR_FIELD hibát jelez.

      Ha van egyezés, és az oszlop a következő:

      • STRUCT: Egyezzen a mezővel.

        Ha a mező nem feleltethető meg, FIELD_NOT_FOUND hibát jelez.

        Ha egynél több mező van, AMBIGUOUS_COLUMN_OR_FIELD hibát jelez.

      • MAP: Hibajelzés, ha a kulcs minősített.

        Futásidejű hiba akkor fordulhat elő, ha a kulcs valójában nem szerepel a térképen.

      • Bármilyen más típus: Hiba felmerülése. C. Ismételje meg az előző lépést a záró azonosító mezőként való eltávolításához. Alkalmazza a szabályokat (A) és (B), amíg van egy azonosító, amelyet oszlopként kell értelmezni.

  2. Oldalirányú oszlop aliasolása

    A következőkre vonatkozik:jelölje be az igennel jelölt jelölőnégyzetet Databricks SQL jelölje be az igennel jelölt jelölőnégyzetet Databricks Runtime 12.2 LTS és újabb

    Ha a kifejezés egy SELECT listában található, egyezzen a vezető azonosítóval egyező oszlop aliasával a SELECT listában.

    Ha egynél több ilyen egyezés van, AMBIGUOUS_LATERAL_COLUMN_ALIAS hibát jelez.

    Egyezzen meg minden fennmaradó azonosítóval mezőként vagy térképkulcsként, és FIELD_NOT_FOUND vagy AMBIGUOUS_COLUMN_OR_FIELD hibát jelez, ha nem lehet őket egyeztetni.

  3. Korrelációs

    • OLDALSÓ

      Ha a lekérdezést egy LATERAL kulcsszó előzi meg, alkalmazza az 1.a és az 1.d szabályt, figyelembe véve a lekérdezést tartalmazó és a lekérdezést megelőző LATERALtáblahivatkozásokatFROM.

    • Rendszeres

      Ha a lekérdezés skaláris alquery, INakkor EXISTS az 1.a, 1.d és 2 szabályt alkalmazza, figyelembe véve a táblahivatkozásokat a lekérdezés FROM záradékában.

  4. Beágyazott korreláció

    Alkalmazza újra a 3. szabályt a lekérdezés beágyazási szintjein.

  5. Rutinparaméterek

    Ha a kifejezés egy CREATE FÜGGVÉNY utasítás része:

    1. Egyezzen az azonosítóval egy paraméternévvel. Ha az azonosító minősített, a minősítőnek meg kell egyeznie a függvény nevével.
    2. Ha az azonosító minősített, egyeznie kell egy paraméter mező- vagy térképkulcsával az 1.c szabályt követve
  6. Változók

    1. Egyezzen az azonosítóval egy változónévvel. Ha az azonosító minősített, a minősítőnek session vagy system.session.
    2. Ha az azonosító minősített, az 1.c szabályt követő változó mező- vagy térképkulcsának felel meg

Korlátozások

A potenciálisan költséges korrelált lekérdezések végrehajtásának megakadályozása érdekében az Azure Databricks egy szintre korlátozza a támogatott korrelációt. Ez a korlátozás az SQL-függvények paraméterhivatkozásaira is vonatkozik.

Példák

-- Differentiating columns and fields
> SELECT a FROM VALUES(1) AS t(a);
 1

> SELECT t.a FROM VALUES(1) AS t(a);
 1

> SELECT t.a FROM VALUES(named_struct('a', 1)) AS t(t);
 1

-- A column takes precendece over a field
> SELECT t.a FROM VALUES(named_struct('a', 1), 2) AS t(t, a);
 2

-- Implict lateral column alias
> SELECT c1 AS a, a + c1 FROM VALUES(2) AS T(c1);
 2  4

-- A local column reference takes precedence, over a lateral column alias
> SELECT c1 AS a, a + c1 FROM VALUES(2, 3) AS T(c1, a);
 2  5

-- A scalar subquery correlation to S.c3
> SELECT (SELECT c1 FROM VALUES(1, 2) AS t(c1, c2)
           WHERE t.c2 * 2 = c3)
    FROM VALUES(4) AS s(c3);
 1

-- A local reference takes precedence over correlation
> SELECT (SELECT c1 FROM VALUES(1, 2, 2) AS t(c1, c2, c3)
           WHERE t.c2 * 2 = c3)
    FROM VALUES(4) AS s(c3);
  NULL

-- An explicit scalar subquery correlation to s.c3
> SELECT (SELECT c1 FROM VALUES(1, 2, 2) AS t(c1, c2, c3)
           WHERE t.c2 * 2 = s.c3)
    FROM VALUES(4) AS s(c3);
 1

-- Correlation from an EXISTS predicate to t.c2
> SELECT c1 FROM VALUES(1, 2) AS T(c1, c2)
    WHERE EXISTS(SELECT 1 FROM VALUES(2) AS S(c2)
                  WHERE S.c2 = T.c2);
 1

-- Attempt a lateral correlation to t.c2
> SELECT c1, c2, c3
    FROM VALUES(1, 2) AS t(c1, c2),
         (SELECT c3 FROM VALUES(3, 4) AS s(c3, c4)
           WHERE c4 = c2 * 2);
 [UNRESOLVED_COLUMN] `c2`

-- Successsful usage of lateral correlation with keyword LATERAL
> SELECT c1, c2, c3
    FROM VALUES(1, 2) AS t(c1, c2),
         LATERAL(SELECT c3 FROM VALUES(3, 4) AS s(c3, c4)
                  WHERE c4 = c2 * 2);
 1  2  3

-- Referencing a parameter of a SQL function
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
    RETURN (SELECT c1 FROM VALUES(1) AS T(c1) WHERE c1 = a);
> SELECT func(1), func(2);
 1  NULL

-- A column takes precedence over a parameter
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
    RETURN (SELECT a FROM VALUES(1) AS T(a) WHERE t.a = a);
> SELECT func(1), func(2);
 1  1

-- Qualify the parameter with the function name
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
    RETURN (SELECT a FROM VALUES(1) AS T(a) WHERE t.a = func.a);
> SELECT func(1), func(2);
 1  NULL

-- Lateral alias takes precedence over correlated reference
> SELECT (SELECT c2 FROM (SELECT 1 AS c1, c1 AS c2) WHERE c2 > 5)
    FROM VALUES(6) AS t(c1)
  NULL

-- Lateral alias takes precedence over function parameters
> CREATE OR REPLACE TEMPORARY FUNCTION func(x INT)
    RETURNS TABLE (a INT, b INT, c DOUBLE)
    RETURN SELECT x + 1 AS x, x
> SELECT * FROM func(1)
  2 2

-- All together now
> CREATE OR REPLACE TEMPORARY VIEW lat(a, b) AS VALUES('lat.a', 'lat.b');

> CREATE OR REPLACE TEMPORARY VIEW frm(a) AS VALUES('frm.a');

> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT, b int, c int)
  RETURNS TABLE
  RETURN SELECT t.*
    FROM lat,
         LATERAL(SELECT a, b, c
                   FROM frm) AS t;

> VALUES func('func.a', 'func.b', 'func.c');
  a      b      c
  -----  -----  ------
  frm.a  lat.b  func.c

Táblázat- és nézetfeloldás

A táblahivatkozásban szereplő azonosító az alábbiak bármelyike lehet:

  • Állandó tábla vagy nézet a Unity Katalógusban vagy a Hive Metastore-ban
  • Gyakori táblakifejezés (CTE)
  • Ideiglenes nézet

Az azonosító feloldása attól függ, hogy minősített-e:

  • Minősített

    Ha az azonosító három részből áll: catalog.schema.relationegyedi.

    Ha az azonosító két részből áll: schema.relationakkor az egyedivé tétele további SELECT current_catalog() minősítést eredményez.

  • Képzetlen

    1. Gyakori táblakifejezés

      Ha a hivatkozás egy WITH záradék hatókörébe tartozik, egyezzen az azonosítóval egy CTE-vel, kezdve az azonnal tartalmazó WITH záradékkal, és onnan haladjon kifelé.

    2. Ideiglenes nézet

      Egyezzen az azonosítóval az aktuális munkamenetben definiált bármely ideiglenes nézethez.

    3. Megőrzött tábla

      Az azonosító teljes minősítéséhez előre függőben kell lennie az eredménynek SELECT current_catalog() , és SELECT current_schema() állandó kapcsolatként kell keresnie.

Ha a reláció nem oldható fel egyetlen táblához, nézethez vagy CTE-hez sem, a Databricks TABLE_OR_VIEW_NOT_FOUND hibát jelez.

Példák

-- Setting up a scenario
> USE CATALOG spark_catalog;
> USE SCHEMA default;

> CREATE TABLE rel(c1 int);
> INSERT INTO rel VALUES(1);

-- An fully qualified reference to rel:
> SELECT c1 FROM spark_catalog.default.rel;
 1

-- A partially qualified reference to rel:
> SELECT c1 FROM default.rel;
 1

-- An unqualified reference to rel:
> SELECT c1 FROM rel;
 1

-- Add a temporary view with a conflicting name:
> CREATE TEMPORARY VIEW rel(c1) AS VALUES(2);

-- For unqualified references the temporary view takes precedence over the persisted table:
> SELECT c1 FROM rel;
 2

-- Temporary views cannot be qualified, so qualifiecation resolved to the table:
> SELECT c1 FROM default.rel;
 1

-- An unqualified reference to a common table expression wins even over a temporary view:
> WITH rel(c1) AS (VALUES(3))
    SELECT * FROM rel;
 3

-- If CTEs are nested, the match nearest to the table reference takes precedence.
> WITH rel(c1) AS (VALUES(3))
    (WITH rel(c1) AS (VALUES(4))
      SELECT * FROM rel);
  4

-- To resolve the table instead of the CTE, qualify it:
> WITH rel(c1) AS (VALUES(3))
    (WITH rel(c1) AS (VALUES(4))
      SELECT * FROM default.rel);
  1

-- For a CTE to be visible it must contain the query
> SELECT * FROM (WITH cte(c1) AS (VALUES(1))
                   SELECT 1),
                cte;
  [TABLE_OR_VIEW_NOT_FOUND] The table or view `cte` cannot be found.

Függvényfeloldás

A függvényhivatkozásokat a zárójelek kötelező záró készlete ismeri fel.

Az alábbiakat oldhatja fel:

A függvénynevek feloldása attól függ, hogy minősített-e:

  • Minősített

    Ha a név három részből áll: catalog.schema.functionegyedi.

    Ha a név két részből áll: schema.functionakkor az egyedivé tétele további SELECT current_catalog() minősítést eredményez.

    A függvény ezután fel lesz keresve a katalógusban.

  • Képzetlen

    A nem minősített függvénynevek esetében az Azure Databricks egy rögzített sorrendet követ(PATH):

    1. Beépített függvény

      Ha egy ilyen nevű függvény létezik a beépített függvények halmaza között, akkor ezt a függvényt választja ki.

    2. Ideiglenes függvény

      Ha egy ilyen nevű függvény szerepel az ideiglenes függvények halmazában, akkor a függvény lesz kiválasztva.

    3. Megőrzött függvény

      Teljes mértékben minősítse a függvény nevét az eredmény előzetes függőben történő függőben történő függőben való SELECT current_catalog() használatával, és SELECT current_schema() keresse meg állandó függvényként.

Ha a függvény nem oldható meg, az Azure Databricks hibát jelez UNRESOLVED_ROUTINE .

Példák

> USE CATALOG spark_catalog;
> USE SCHEMA default;

-- Create a function with the same name as a builtin
> CREATE FUNCTION concat(a STRING, b STRING) RETURNS STRING
    RETURN b || a;

-- unqualified reference resolves to the builtin CONCAT
> SELECT concat('hello', 'world');
 helloworld

-- Qualified reference resolves to the persistent function
> SELECT default.concat('hello', 'world');
 worldhello

-- Create a persistent function
> CREATE FUNCTION func(a INT, b INT) RETURNS INT
    RETURN a + b;

-- The persistent function is resolved without qualifying it
> SELECT func(4, 2);
 6

-- Create a conflicting temporary function
> CREATE FUNCTION func(a INT, b INT) RETURNS INT
    RETURN a / b;

-- The temporary function takes precedent
> SELECT func(4, 2);
 2

-- To resolve the persistent function it now needs qualification
> SELECT spark_catalog.default.func(4, 3);
 6