Delen via


Naamomzetting

Van toepassing op:aangevinkt als ja Databricks SQL aangevinkt als ja Databricks Runtime

Naamomzetting is het proces waarmee id's worden omgezet in specifieke kolom-, veld-, parameter- of tabelverwijzingen.

Kolom-, veld-, parameter- en variabeleverwerking

Id's in expressies kunnen verwijzingen naar een van de volgende zijn:

  • Kolomnaam op basis van een view, tabel, algemene tabelexpressie (CTE) of een column_alias.
  • Veldnaam of kaartsleutel binnen een struct of kaart. Velden en sleutels kunnen nooit ongedefinieerd zijn.
  • Parameternaam van een door de gebruiker gedefinieerde SQL-functie.
  • Variabelenaam van een lokale sessie of SQL-script .
  • Een speciale functie, zoals current_user of current_date, waarvoor geen gebruik van () vereist is.
  • Het DEFAULT trefwoord dat wordt gebruikt in de context vanINSERT, UPDATEof MERGESET VARIABLEom een kolom- of variabelewaarde in te stellen op de standaardwaarde.

Naamomzetting past de volgende principes toe:

  • De dichtstbijzijnde overeenkomende referentie wint en
  • Kolommen en parameters zijn belangrijker dan velden en sleutels.

In detail volgt de oplossing van id's naar een specifieke verwijzing de volgende regels in volgorde:

  1. Lokale verwijzingen

    1. Kolomreferentie

      Koppel de identificator, die eventueel kan worden gekwalificeerd, aan een kolomnaam in een tabelreferentie van de FROM clause.

      Als er meer dan één overeenkomst is, geeft u een AMBIGUOUS_COLUMN_OR_FIELD fout op.

    2. Parameterloze functie referentie

      Als de id niet gekwalificeerd is en overeenkomt met current_user, current_date of current_timestamp: Los deze op als een van deze functies.

    3. Standaardspecificatie voor kolom

      Als de id niet gekwalificeerd is, komt deze overeen default en vormt deze de volledige expressie in de context van een UPDATE SET, INSERT VALUESof MERGE WHEN [NOT] MATCHED: Oplossen als de respectieve DEFAULT waarde van de doeltabel van de INSERT, UPDATE of MERGE.

    4. Verwijzing naar veld- of mapsleutel

      Als de id is gekwalificeerd, probeert u deze te koppelen aan een veld- of kaartsleutel volgens de volgende stappen:

      A. Verwijder de laatste identifier en behandel deze als een veld of sleutel. B. De rest afstemmen op een kolom in tabelreferentie van de FROM clausetabel.

      Als er meer dan één overeenkomst is, wordt er een AMBIGUOUS_COLUMN_OR_FIELD-fout veroorzaakt.

      Als er een overeenkomst is en de kolom een:

      • STRUCT: Komt overeen met het veld.

        Als het veld niet overeenkomt, geef een FIELD_NOT_FOUND foutmelding.

        Als er meer dan één veld is, wordt een AMBIGUOUS_COLUMN_OR_FIELD fout gegenereerd.

      • MAP: Genereer een foutmelding als de sleutel is gekwalificeerd.

        Er kan een runtimefout optreden als de sleutel niet daadwerkelijk aanwezig is in de kaart.

      • Elk ander type: een fout genereren. C. Herhaal de voorgaande stap om de volg-id als veld te verwijderen. Pas regels (A) en (B) toe terwijl er nog een identifier is die moet worden geïnterpreteerd als een kolom.

  2. Laterale kolomaliasvorming

    Van toepassing op:vinkje als ja aan Databricks SQL vinkje als ja aan Databricks Runtime 12.2 LTS en hoger

    Als de expressie zich in een SELECT lijst bevindt, komt de voorafgaande identifier overeen met een voorgaande kolomalias in die SELECT lijst.

    Als er meer dan één overeenkomst is, moet u een AMBIGUOUS_LATERAL_COLUMN_ALIAS fout melden.

    Match elke resterende identificator als een veld of een sleutel in een map, en geef de FIELD_NOT_FOUND of AMBIGUOUS_COLUMN_OR_FIELD fout weer als ze niet kunnen overeenkomen.

  3. Correlatie

    • LATERAAL

      Als de query wordt voorafgegaan door een LATERAL trefwoord, past u regels 1.a en 1.d toe, rekening houdend met de tabelverwijzingen in de FROM met de query en vóór de LATERALquery.

    • Normaal

      Als de query een scalaire subquery, IN, of EXISTS subquery is, worden regels 1.a, 1.d en 2 toegepast, rekening houdend met de tabelverwijzingen in de FROM-clausule van de omhullende query.

  4. Geneste correlatie

    Herhaal het toepassen van regel 3 door iteratief de nestniveaus van de query door te lopen.

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

    Als de verklaring is opgenomen in een FOR lus:

    A. Koppel de id aan een kolom in een FOR lusinstructiequery. Als de id is gekwalificeerd, moet de kwalificatie overeenkomen met de naam van de FOR-lusvariabele, indien gedefinieerd. B. Als de identificator is gekwalificeerd, komt deze overeen met een veld of sleutel van een mapping van een parameter volgens regel 1.c

  6. samengestelde instructie

    Als de instructie is opgenomen in een samengestelde instructie:

    A. Koppel de identificator aan een variabele die binnen de samengestelde instructie is gedeclareerd. Als de identificator is gekwalificeerd, moet de kwalificatie overeenkomen met het label van de samengestelde instructie als er een is gedefinieerd. B. Als de identificator is gekwalificeerd, komt het overeen met een veld of een sleutel van een map van een variabele volgens regel 1.c

  7. geneste samengestelde instructie of FOR lus

    Pas regels 5 en 6 opnieuw toe door over de nestniveaus van de samengestelde opdracht te itereren.

  8. Routineparameters

    Als de expressie deel uitmaakt van een CREATE FUNCTION-instructie:

    1. Koppel de id aan een parameternaam. Als de identificator is gekwalificeerd, moet de kwalificatie overeenkomen met de naam van de routine.
    2. Als de identificator is gekwalificeerd, komt het overeen met een veld of sleutelwaarde van een parameter volgens regel 1.c
  9. Sessievariabelen

    1. Koppel de id aan een variabelenaam. Als de identifier is gekwalificeerd, moet de kwalificatie session of system.session zijn.
    2. Als de identificatie gekwalificeerd is, komt het overeen met een veld- of mappsleutel van een variabele volgens regel 1.c

Beperkingen

Om te voorkomen dat mogelijk dure gecorreleerde query's worden uitgevoerd, beperkt Azure Databricks de ondersteunde correlatie tot één niveau. Deze beperking geldt ook voor parameterverwijzingen in SQL-functies.

Voorbeelden

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

Tabel- en weergave-resolutie

Een id in tabelverwijzing kan een van de volgende zijn:

  • Permanente tabel of weergave in Unity Catalog of de Hive-metastore
  • Algemene tabelexpressie (CTE)
  • Tijdelijke weergave

De oplossing van een id is afhankelijk van of deze is gekwalificeerd:

  • Gekwalificeerd

    Als de id volledig is gekwalificeerd met drie onderdelen: catalog.schema.relationis deze uniek.

    Als de id uit twee delen bestaat: schema.relation, wordt deze verder onderscheiden met het resultaat van SELECT current_catalog() om hem uniek te maken.

  • Onbevoegd

    1. Algemene tabelexpressie

      Als de verwijzing binnen het bereik van een WITH clausule valt, koppelt u de identificatie aan een CTE die begint bij de onmiddellijk bevattende WITH clausule en zich van daaruit naar buiten beweegt.

    2. Tijdelijke weergave

      Koppel de identificatie aan een tijdelijke weergave die tijdens de huidige sessie is gedefinieerd.

    3. Persistente tabel

      Het kenmerk volledig kwalificeren door het resultaat van SELECT current_catalog() voor te plaatsen en SELECT current_schema() op te zoeken als een blijvende relatie.

Als de relatie niet kan worden omgezet in een tabel, weergave of CTE, genereert Databricks een TABLE_OR_VIEW_NOT_FOUND fout.

Voorbeelden

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

Functieomzetting

Een functieverwijzing wordt herkend door de verplichte reeks haakjes.

Het kan leiden tot:

De oplossing van een functienaam is afhankelijk van of deze is gekwalificeerd:

  • Gekwalificeerd

    Als de naam volledig is gekwalificeerd met drie delen: catalog.schema.function, is deze uniek.

    Als de naam uit twee delen bestaat, schema.functionwordt deze verder gekwalificeerd met het resultaat SELECT current_catalog() om deze uniek te maken.

    De functie wordt vervolgens opgezoekd in de catalogus.

  • Onbevoegd

    Voor niet-gekwalificeerde functienamen volgt Azure Databricks een vaste volgorde van prioriteit (PATH):

    1. Ingebouwde functie

      Als er een functie met deze naam bestaat in de set ingebouwde functies, wordt die functie gekozen.

    2. Tijdelijke functie

      Als er een functie met deze naam bestaat tussen de set tijdelijke functies, wordt die functie gekozen.

    3. Persistente functie

      Kwalificeer de functienaam volledig door het resultaat van SELECT current_catalog() eraan vooraf te laten gaan en zoek het op als een permanente functie.

Als de functie niet kan worden opgelost, treedt er een UNRESOLVED_ROUTINE fout op in Azure Databricks.

Voorbeelden

> 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