Sdílet prostřednictvím


Řešení jmen

Platí pro:zaškrtnuté ano Databricks SQL zaškrtnuté ano Databricks Runtime

Překlad názvů je proces, pomocí kterého se identifikátory překládají na konkrétní sloupec, pole, parametr nebo odkazy na tabulky.

Rozlišení sloupců, polí, parametrů a proměnných

Identifikátory ve výrazech můžou být odkazy na některou z následujících možností:

  • Název sloupce založený na zobrazení, tabulce, společném tabulkovém výrazu (CTE) nebo column_alias.
  • Název pole nebo klíč mapování v rámci struktury nebo mapy. Pole a klíče nemohou být nikdy nekvalifikovány.
  • Název parametruuživatelem definované funkce SQL nebo procedury SQL
  • Místní název proměnné relace nebo skriptu SQL název proměnné.
  • Zvláštní funkce, jako je current_user nebo current_date, která nevyžaduje použití ().
  • Klíčové DEFAULT slovo, které se používá v kontextu INSERT, UPDATE, MERGEnebo SET VARIABLE k nastavení sloupce nebo proměnné hodnoty na výchozí.

Rozlišení názvů používá následující principy:

  • Nejbližší odpovídající referenční bod vyhrává a
  • Sloupce a parametry mají přednost před poli a klíči.

Podrobné rozlišení identifikátorů na konkrétní odkaz se řídí těmito pravidly v tomto pořadí:

  1. Místní odkazy

    1. Odkaz na sloupec

      Porovnejte identifikátor, který může být kvalifikovaný, s názvem sloupce v referenci na tabulkuFROM clause.

      Pokud existuje více takových shod, bude vyvolána chyba AMBIGUOUS_COLUMN_OR_FIELD.

    2. Referenční informace k funkcím bez parametrů

      Pokud je identifikátor nekvalifikovaný a odpovídá current_user, current_datenebo current_timestamp: Přeložte ho jako jednu z těchto funkcí.

    3. Specifikace DEFAULT sloupce

      Pokud je identifikátor nekvalifikovaný, odpovídá default a tvoří celý výraz v kontextu objektu UPDATE SET, INSERT VALUES nebo MERGE WHEN [NOT] MATCHED, vyřešit jako odpovídající hodnotu DEFAULT cílové tabulky INSERT, UPDATE nebo MERGE.

    4. Odkaz na pole struktury nebo mapovací klíč

      Pokud je identifikátor kvalifikovaný, snažte se ho spárovat s polem nebo mapovacím klíčem podle následujících kroků:

      A. Odeberte poslední identifikátor a zacházejte s ním jako s polem nebo klíčem. B. Porovnej zbytek se sloupcem v odkazu na tabulkuFROM clause.

      Pokud existuje více takových shod, bude vyvolána chyba AMBIGUOUS_COLUMN_OR_FIELD.

      Pokud existuje shoda a sloupec je následující:

      • STRUCT: Porovná pole.

        Pokud pole nelze spárovat, vyvolejte chybu FIELD_NOT_FOUND.

        Pokud existuje více než jedno pole, vyvolejte chybu AMBIGUOUS_COLUMN_OR_FIELD.

      • MAP: Vyvolání chyby, pokud je klíč kvalifikovaný.

        K eroru modulu runtime může dojít, pokud klíč ve skutečnosti není v mapě.

      • Jakýkoli jiný typ: Vyvolání chyby C. Opakováním předchozího kroku odeberte koncový identifikátor jako pole. Použijte pravidla (A) a (B), zatímco existuje identifikátor, který se má interpretovat jako sloupec.

  2. Boční aliasování sloupců

    Platí pro:zaškrtnuto ano Databricks SQL zaškrtnuto ano Databricks Runtime 12.2 LTS a vyšší

    Pokud je výraz v SELECT seznamu, shodujte počáteční identifikátor s předchozím aliasem sloupce v daném SELECT seznamu.

    Pokud existuje více takových shod, vyvolá se chyba AMBIGUOUS_LATERAL_COLUMN_ALIAS.

    Porovná každý zbývající identifikátor buď jako pole nebo klíč mapy a vyvolá chybu FIELD_NOT_FOUND nebo AMBIGUOUS_COLUMN_OR_FIELD, pokud se neshodují.

  3. Korelace

    • BOČNÍ

      Pokud dotazu předchází klíčové slovo LATERAL, použijte pravidla 1.a a 1.d s ohledem na odkazy na tabulku v FROM obsahujícím dotaz a před LATERAL.

    • Běžný

      Pokud je dotaz skalární poddotaz, INnebo EXISTS poddotaz použijte pravidla 1.a, 1.d a 2 s ohledem na odkazy na tabulku v klauzuli obsahující dotaz FROM .

  4. Vnořená korelace

    Znovu použijte pravidlo 3 iterováním nad úrovněmi vnoření dotazu.

  5. [FOR loop](control-flow/for-stmt.md]

    Pokud je příkaz obsažený ve smyčce FOR:

    A. Přiřaďte identifikátor ke sloupci v dotazu smyčky FOR. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat názvu proměnné smyčky FOR, pokud je definován. B. Pokud je identifikátor kvalifikovaný, přiřaďte k poli nebo klíči mapy parametru podle pravidla 1.c.

  6. složený příkaz

    Pokud je příkaz obsažen ve složeném příkazu:

    A. Porovná identifikátor s proměnnou deklarovanou v daném složeného příkazu. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat popisku složeného příkazu, pokud byl definován. B. Pokud je identifikátor kvalifikovaný, přiřaďte ho poli nebo mapovému klíči proměnné podle pravidla 1.c.

  7. vnořený složený příkaz nebo smyčka FOR

    Znovu použijte pravidla 5 a 6, provádějte iterace přes úrovně vnoření složeného příkazu.

  8. Rutinní parametry

    Pokud je výraz součástí CREATE FUNCTION příkazu NEBO CREATE PROCEDURE :

    1. Přiřaďte identifikátor k názvu parametru. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat názvu rutiny.
    2. Pokud je identifikátor kvalifikovaný, přiřaďte k poli nebo klíči mapy parametru podle pravidla 1.c.
  9. proměnné relace

    1. Přiřaďte identifikátor k názvu proměnné. Pokud je identifikátor kvalifikovaný, musí být session nebo system.session.
    2. Pokud je identifikátor kvalifikovaný, přiřaďte ho poli nebo mapovému klíči proměnné podle pravidla 1.c.

Omezení

Aby se zabránilo spuštění potenciálně drahých korelovaných dotazů, Azure Databricks omezuje podporovanou korelaci na jednu úroveň. Toto omezení platí také pro odkazy na parametry ve funkcích SQL.

Příklady

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

Rozlišení tabulky a zobrazení

Identifikátor v table-reference může být jakýkoli z následujících:

  • Trvalá tabulka nebo zobrazení v Unity Catalogu nebo Hive Metastore
  • Běžný tabulkový výraz (CTE)
  • Dočasné zobrazení

Řešení identifikátoru závisí na tom, jestli je kvalifikovaný:

  • Kvalifikovaný

    Pokud je identifikátor plně kvalifikovaný se třemi částmi: catalog.schema.relationje jedinečný.

    Pokud se identifikátor skládá ze dvou částí: schema.relationje dále kvalifikovaný s výsledkem SELECT current_catalog() , aby byl jedinečný.

  • Nekvalifikovaný

    1. Běžný výraz tabulky

      Pokud je odkaz v rozsahu WITH klauzule, shodujte identifikátor s CTE, který začíná okamžitě obsahující WITH klauzulí a přechází směrem odsud.

    2. Dočasné zobrazení

      Porovná identifikátor s jakýmkoli dočasným zobrazením definovaným v aktuální relaci.

    3. Perzistentní tabulka

      Plně kvalifikujte identifikátor před čekáním na výsledek SELECT current_catalog() a SELECT current_schema() vyhledejte ho jako trvalý vztah.

Pokud se relace nedá přeložit na žádnou tabulku, zobrazení nebo CTE, Databricks vyvolá chybu TABLE_OR_VIEW_NOT_FOUND .

Příklady

-- 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.

Vyhodnocení funkce

Odkaz na funkci je rozpoznán povinnou koncovou sadou závorek.

Může být vyřešeno na:

  • Vestavěná funkce poskytovaná službou Azure Databricks
  • Dočasná funkce definovaná uživatelem vymezená na aktuální relaci nebo
  • Trvalá uživatelem definovaná funkce uložená v metastoru Hive nebo v katalogu Unity.

Stanovení názvu funkce závisí na tom, zda je kvalifikovaný.

  • Kvalifikovaný

    Pokud je název plně kvalifikovaný se třemi částmi: catalog.schema.functionje jedinečný.

    Pokud se název skládá ze dvou částí: schema.function, rozlišuje se výsledkem SELECT current_catalog(), aby byl jedinečný.

    Funkce se pak vyhledá v katalogu.

  • Nekvalifikovaný

    Pro nekvalifikované názvy funkcí Azure Databricks se řídí pevným pořadím priority (PATH):

    1. Vestavěná funkce

      Pokud funkce podle tohoto názvu existuje mezi sadou předdefinovaných funkcí, vybere se tato funkce.

    2. Dočasná funkce

      Pokud funkce podle tohoto názvu existuje mezi sadou dočasných funkcí, vybere se tato funkce.

    3. Perzistentní funkce

      Úplně kvalifikujte název funkce tím, že před něj umístíte výsledek SELECT current_catalog() a SELECT current_schema() a vyhledejte ji jako trvalou funkci.

Pokud funkci nejde vyřešit, Azure Databricks vyvolá UNRESOLVED_ROUTINE chybu.

Příklady

> 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