Rozpoznawanie nazw
Dotyczy: Databricks SQL Databricks Runtime
Rozpoznawanie nazw to proces, za pomocą którego identyfikatory są rozwiązywane do określonych column-, pól, parametrów lub table-odniesień.
Column, pole, parametr i rozdzielczość zmiennej
Identyfikatory w wyrażeniach mogą być odwołaniami do dowolnego z następujących elementów:
- Column nazwa na podstawie widoku, table, wspólnego wyrażenia table (CTE) lub column_alias.
- Nazwa pola lub klucz mapy w obrębie struktury lub mapy. Pola i klucze nigdy nie mogą być niekwalifikowane.
- Nazwa parametru funkcji zdefiniowanej przez użytkownika SQL.
- Nazwa zmiennej.
- Specjalna funkcja, taka jak
current_user
lubcurrent_date
która nie wymaga użycia elementu()
. - Słowo kluczowe
DEFAULT
, które jest używane w kontekścieINSERT
,UPDATE
,MERGE
lubSET VARIABLE
, aby set wartość column lub zmiennej do wartości domyślnej.
Rozpoznawanie nazw stosuje następujące zasady:
- Najbliższe dopasowanie odniesienia wygrywa i
- Columns i parametr mają przewagę nad polami i kluczami.
Szczegółowo rozpoznawanie identyfikatorów do określonego odwołania jest zgodne z następującymi regułami w następującej kolejności:
Odwołania lokalne
dokumentacja Column
Dopasuj identifier, która może być kwalifikowana, do nazwy column w odniesieniu table referencji
FROM clause
.Jeśli istnieje więcej niż jedno dopasowanie, zgłoś błąd AMBIGUOUS_COLUMN_OR_FIELD .
Dokumentacja funkcji bez parametrów
Jeśli identifier jest nieokreślona i pasuje do
current_user
,current_date
lubcurrent_timestamp
, rozpatrz ją jako jedną z tych funkcji.Column Specyfikacja DOMYŚLNA
Jeśli identifier jest niekwalifikowana, dopasuje
default
i tworzy całe wyrażenie w kontekścieUPDATE SET
,INSERT VALUES
lubMERGE WHEN [NOT] MATCHED
: Rozwiąż jako odpowiednią wartośćDEFAULT
docelowego tableINSERT
,UPDATE
lubMERGE
.Odwołanie do pola struktury lub klucza mapy
Jeśli identifier jest zakwalifikowany, spróbuj dopasować je do pola lub klucza mapy z następującymi krokami:
Odp. Remove ostatni identifier i traktuj go jako pole lub klucz. B. Dopasuj resztę do
w odniesieniu do z . Jeśli istnieje więcej niż jedno dopasowanie, zgłoś błąd AMBIGUOUS_COLUMN_OR_FIELD .
Jeśli istnieje dopasowanie, a column to:
STRUCT
: dopasuj pole.Jeśli nie można dopasować pola, zgłoś błąd FIELD_NOT_FOUND .
Jeśli istnieje więcej niż jedno pole, zgłoś błąd AMBIGUOUS_COLUMN_OR_FIELD .
MAP
: zgłoś błąd, jeśli klucz jest kwalifikowany.Moduł uruchomieniowy może wystąpić, jeśli klucz nie jest rzeczywiście obecny na mapie.
Dowolny inny typ: zgłoś błąd. C. Powtórz poprzedni krok, aby remove traktować końcówkę identifier jako pole. Zastosuj reguły (A) i (B), dopóki jest identifier do interpretacji jako column.
column aliasowania lateral
Dotyczy: Databricks SQL Databricks Runtime 12.2 LTS i nowsze
Jeśli wyrażenie znajduje się w
SELECT
list, dopasuj wiodący identifier do poprzedniego aliasu column w tymSELECT
list.Jeśli istnieje więcej niż jeden taki dopasowanie, zgłoś błąd AMBIGUOUS_LATERAL_COLUMN_ALIAS .
Dopasuj każdą pozostałą identifier jako pole lub klucz mapy i zgłoś błąd FIELD_NOT_FOUND lub AMBIGUOUS_COLUMN_OR_FIELD, jeśli nie można ich dopasować.
Korelacja
BOCZNY
Jeśli zapytanie jest poprzedzone słowem kluczowym
LATERAL
, zastosuj reguły 1.a i 1.d, biorąc pod uwagę odwołania table wFROM
zawierające zapytanie i poprzedzająceLATERAL
.Normalna
Jeśli zapytanie jest podzapytaniem skalarnym ,,
IN
lub podzapytaniemEXISTS
, zastosuj reguły 1.a, 1.d i 2, uwzględniając odwołania table w klauzuliFROM
zapytania, które je zawiera.
Korelacja zagnieżdżona
Zastosuj ponownie regułę 3 iteracji na poziomach zagnieżdżania zapytania.
Rutynowe parameters
Jeśli wyrażenie jest częścią instrukcji CREATE FUNCTION:
Zmienne
Ograniczenia
Aby zapobiec wykonywaniu potencjalnie kosztownych skorelowanych zapytań, usługa Azure Databricks ogranicza obsługiwaną korelację do jednego poziomu. To ograniczenie dotyczy również odwołań do parametrów w funkcjach SQL.
Przykłady
-- 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
Table i rozdzielczość widoku
identifier w table— odwołanie może być jednym z następujących:
- Trwałe table lub widok w usłudze Unity Catalog lub magazynie metadanych Hive
- Typowe wyrażenie table (CTE)
- Widok tymczasowy
Rozwiązanie identifier zależy od tego, czy jest ono zakwalifikowane.
Wykwalifikowany
Jeśli identifier ma trzy kwalifikowane części, w tym
catalog.schema.relation
, jest unikatowa.Jeśli identifier składa się z dwóch części:
schema.relation
, jest dodatkowo kwalifikowany wynikiemSELECT current_catalog()
, aby uczynić go jedynym w swoim rodzaju.Niekwalifikowanych
powszechne table wyrażenie
Jeśli odwołanie znajduje się w zakresie klauzuli
WITH
, dopasuj identifier do CTE, zaczynając od natychmiast zawierającej klauzulęWITH
i przenosząc się z niej na zewnątrz.Widok tymczasowy
Dopasuj identifier do dowolnego widoku tymczasowego zdefiniowanego w bieżącej sesji.
utrwalone table
W pełni qualifyidentifier, poprzedzając je wynikiem
SELECT current_catalog()
iSELECT current_schema()
, a następnie wyszukując to jako trwałą relację.
Jeśli nie można rozpoznać relacji do żadnego table, widoku lub CTE, usługa Databricks zgłasza błąd TABLE_OR_VIEW_NOT_FOUND.
Przykłady
-- 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.
Rozpoznawanie funkcji
Odwołanie do funkcji jest rozpoznawane przez obowiązkowe set na końcu nawiasów.
Może to rozwiązać problem:
- Wbudowana funkcja udostępniana przez usługę Azure Databricks,
- Funkcja zdefiniowana przez użytkownika tymczasowego w zakresie bieżącej sesji lub
- Trwała funkcja zdefiniowana przez użytkownika przechowywana w magazynie metadanych hive lub unity Catalog.
Rozpoznawanie nazwy funkcji zależy od tego, czy jest kwalifikowana:
Wykwalifikowany
Jeśli nazwa jest w pełni kwalifikowana z trzema częściami:
catalog.schema.function
, jest unikatowa.Jeśli nazwa składa się z dwóch części:
schema.function
, jest ona dodatkowo kwalifikowana z wynikiemSELECT current_catalog()
, aby była unikatowa.Funkcja zostanie następnie wyszukana w catalog.
Niekwalifikowanych
W przypadku niekwalifikowanych nazw funkcji usługa Azure Databricks jest zgodna ze stałą kolejnością pierwszeństwa (
PATH
):Builtin, funkcja
Jeśli funkcja o tej nazwie istnieje wśród set wbudowanych funkcji, zostanie wybrana ta funkcja.
Funkcja tymczasowa
Jeśli funkcja o tej nazwie istnieje wśród set funkcji tymczasowych, zostanie wybrana ta funkcja.
Utrwalone funkcje
W pełni qualify nazwę funkcji przez wstępne oczekiwanie na wynik
SELECT current_catalog()
iSELECT current_schema()
i wyszukaj ją jako funkcję trwałą.
Jeśli nie można rozpoznać funkcji, usługa Azure Databricks zgłasza UNRESOLVED_ROUTINE
błąd.
Przykłady
> 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