이름 확인
적용 대상: Databricks SQL Databricks Runtime
이름 확인은
Column, 필드, 매개 변수 및 변수 해결
식의 식별자는 다음 중 하나에 대한 참조일 수 있습니다.
- Column 이름 뷰, table, CTE(공용 table 식) 또는 column_alias기반으로 합니다.
- 구조체 또는 맵 내의 필드 이름 또는 맵 키. 필드와 키는 정규화되지 않을 수 없습니다.
- SQL 사용자 정의 함수의 매개 변수 이름.
- 변수 이름입니다.
-
current_user
를 사용할 필요가 없는current_date
또는()
와 같은 특수 함수. -
column 또는 변수 값을 기본값으로 set
INSERT
,UPDATE
,MERGE
또는SET VARIABLE
컨텍스트에서 사용되는DEFAULT
키워드입니다.
이름 확인에는 다음 원칙이 적용됩니다.
- 가장 가깝게 일치하는 참조가 사용되고
- Columns 및 매개 변수가 필드 및 키보다 우위를 점합니다.
구체적으로 특정 참조에 대한 식별자 확인은 다음 규칙을 순서대로 따릅니다.
로컬 참조
Column 참조
자격이 부여될 수 있는 identifier을(를)
FROM clause
의 table 참조 내 column 이름과 일치시킵니다.일치하는 항목이 두 개 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류가 발생합니다.
매개 변수가 없는 함수 참조
identifier가 자격이 없고
current_user
,current_date
또는current_timestamp
와 일치하는 경우: 이 함수 중 하나로 결정합니다.Column DEFAULT 사양
identifier가 정규화되지 않은 경우,
default
과 일치하고UPDATE SET
,INSERT VALUES
또는MERGE WHEN [NOT] MATCHED
컨텍스트에서 전체 식을 구성하며, 해당INSERT
,UPDATE
또는MERGE
의 목표 table의DEFAULT
값으로 해석합니다.구조체 필드 또는 맵 키 참조
identifier가 자격이 있는 경우, 다음 단계에 따라 필드 또는 매핑 키와 일치하도록 노력합니다.
A. 마지막 Remove 및 identifier을 필드 또는 키로 처리합니다. B. 나머지를
의 참조에서 에 과 일치시키세요. 일치하는 항목이 두 개 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류가 발생합니다.
일치하는 항목이 있고 column이/가 다음과 같을 경우:
STRUCT
: 필드를 일치시킵니다.필드를 일치시킬 수 없으면 FIELD_NOT_FOUND 오류를 발생시킵니다.
필드가 둘 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.
MAP
: 키가 정규화되면 오류를 발생시킵니다.키가 맵에 실제로 존재하지 않으면 런타임 오류가 발생할 수 있습니다.
기타 형식: 오류를 발생시킵니다. C. 이전 단계를 반복하여 remove 뒤에 오는 identifier을 필드로 만드십시오. identifier가 column로 해석될 수 있는 한, 규칙(A)와 (B)를 적용합니다.
횡적 column 에일리어싱
적용 대상: Databricks SQL Databricks Runtime 12.2 LTS 이상
표현식이
SELECT
list내에 있는 경우, identifier를 앞서 나오는 column 별칭와 그SELECT
list내에서 일치시킵니다.일치하는 항목이 두 개 이상 있으면 AMBIGUOUS_LATERAL_COLUMN_ALIAS 오류가 발생합니다.
나머지 각 identifier를 필드 또는 맵의 키로 일치시키며, 일치 시킬 수 없는 경우에는 FIELD_NOT_FOUND 또는 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.
상관 관계
옆의
쿼리 앞에
LATERAL
키워드가 있는 경우, 쿼리를 포함하고LATERAL
앞에 위치한FROM
안의 table 참조를 고려하여 규칙 1.a와 1.d를 적용합니다.Regular
쿼리가 스칼라 하위 쿼리,
IN
또는EXISTS
하위 쿼리인 경우 포함하는 쿼리의FROM
절에서 table 참조를 고려하여 규칙 1.a, 1.d 및 2를 적용합니다.
중첩된 상관 관계
쿼리의 중첩 수준을 반복하는 규칙 3을 다시 적용합니다.
루틴 parameters
표현이 CREATE FUNCTION 문의 일부인 경우:
- identifier을(를) 매개 변수 이름에 일치시키세요. identifier가 자격을 갖춘 경우, 한정자는 함수의 이름과 일치해야 합니다.
- identifier가 자격이 있는 경우, 규칙 1.c에 따라 매개 변수의 필드 또는 맵 키와 일치시킵니다.
변수
-
identifier을 변수 이름와 일치시키세요.
identifier 정규화된 경우 한정자는
session
또는system.session
합니다. - identifier가 적격인 경우, 규칙 1.c에 따라 변수를 필드나 맵 키에 맞춥니다.
-
identifier을 변수 이름와 일치시키세요.
identifier 정규화된 경우 한정자는
제한 사항
잠재적으로 비용이 많이 드는 상호 관련된 관계 쿼리의 실행을 방지하기 위해 Azure Databricks는 지원되는 상호 관련된 관계를 한 수준으로 제한합니다. 이 제한은 SQL 함수의 매개 변수 참조에도 적용됩니다.
예제
-- 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 및 화면 해상도
identifier는 table참조에서 다음 중 하나일 수 있습니다.
- Unity Catalog 또는 Hive Metastore에서의 영구 table 또는 보기
- 일반적인 table 표현 (CTE)
- 임시 뷰
identifier 해결은 자격을 갖췄는지 여부에 따라 달라집니다.
우량
identifier가 세 부분인
catalog.schema.relation
로 완전히 정규화되면, 이는 고유합니다.identifier가 두 부분으로 이루어져 있을 경우,
schema.relation
은SELECT current_catalog()
의 결과로 추가로 보완하여 고유하게 만듭니다.정규화되지 않음
일반적인 table 식
참조가
WITH
절의 범위 내에 있는 경우, identifier을 CTE에 맞추되 즉시 포함된WITH
절에서 시작하여 그로부터 바깥쪽으로 이동하며 일치시킵니다.임시 뷰
identifier을 현재 세션 내에 정의된 임시 뷰 중 하나와 일치시키십시오.
지속형 table
SELECT current_catalog()
및SELECT current_schema()
의 결과를 앞에 첨가하여 identifier을 완전히 qualify한 다음, 이를 영구 관계로 조회합니다.
관계를 어떤 table, 뷰 또는 CTE로도 해석할 수 없으면 Databricks은 TABLE_OR_VIEW_NOT_FOUND 오류를 발생시킵니다.
예제
-- 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.
함수 해결
함수 참조는 괄호에 필수적으로 뒤따르는 set에 의해 인식됩니다.
다음과 같이 해결할 수 있습니다.
- Azure Databricks에서 제공하는 기본 제공 함수,
- 현재 세션으로 범위가 지정된 임시 사용자 정의 함수 또는
- Hive 메타스토어나 Unity Catalog에 저장된 영구 사용자 정의 함수입니다.
함수 이름의 확인은 정규화 여부에 따라 달라집니다.
우량
이름이 세 부분(
catalog.schema.function
)으로 정규화된 경우 고유합니다.이름이
schema.function
의 두 부분으로 구성된 경우 고유하게 만들기 위해SELECT current_catalog()
의 결과로 추가로 한정됩니다.그런 다음 함수를 catalog에서 조회합니다.
정규화되지 않음
정규화되지 않은 함수 이름의 경우 Azure Databricks는 고정된 우선 순위(
PATH
)를 따릅니다.기본 제공 함수
이 이름의 함수가 기본 제공 함수의 set 사이에 있으면 해당 함수가 선택됩니다.
임시 함수
이 이름의 함수가 임시 함수의 set 사이에 있으면 해당 함수가 선택됩니다.
지속형 함수
SELECT current_catalog()
및SELECT current_schema()
결과를 미리 보류하여 함수 이름을 완전히 qualify 영구 함수로 조회합니다.
함수를 확인할 수 없는 경우 Azure Databricks에서 UNRESOLVED_ROUTINE
오류가 발생합니다.
예제
> 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