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