이름 확인

적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks 런타임

이름 확인은 식별자가 특정 열, 필드, 매개 변수 또는 테이블 참조로 확인되는 프로세스입니다.

열, 필드, 매개 변수 및 변수 확인

의 식별자는 다음 중 하나에 대한 참조일 수 있습니다.

  • 뷰, 테이블, 공통 테이블 식(CTE) 또는 column_alias를 기반으로 하는 열 이름.
  • 구조체 또는 맵 내의 필드 이름 또는 맵 키. 필드와 키는 정규화되지 않을 수 없습니다.
  • SQL 사용자 정의 함수매개 변수 이름.
  • 변수 이름입니다.
  • ()를 사용할 필요가 없는 current_user 또는 current_date와 같은 특수 함수.
  • DEFAULT 의 컨텍스트MERGEINSERTUPDATE에서 사용되거나 열 또는 SET VARIABLE 변수 값을 기본값으로 설정하는 데 사용되는 키워드(keyword).

이름 확인에는 다음 원칙이 적용됩니다.

  • 가장 가깝게 일치하는 참조가 사용되고
  • 열과 매개 변수는 필드와 키보다 우선합니다.

구체적으로 특정 참조에 대한 식별자 확인은 다음 규칙을 순서대로 따릅니다.

  1. 로컬 참조

    1. 열 참조

      한정될 수 있는 식별자를 FROM clause테이블 참조에 있는 열 이름과 일치시킵니다.

      일치하는 항목이 두 개 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류가 발생합니다.

    2. 매개 변수가 없는 함수 참조

      식별자가 규정되지 않고 current_user, current_date 또는 current_timestamp와 일치하는 경우: 다음 함수 중 하나로 해결합니다.

    3. 열 DEFAULT 사양

      식별자가 규정되지 않은 경우 default와 일치하고 UPDATE SET, INSERT VALUES 또는 MERGE WHEN [NOT] MATCHED의 컨텍스트에서 전체 식을 구성합니다. INSERT, UPDATE 또는 MERGE의 대상 테이블에 대한 각각의 DEFAULT 값으로 확인합니다.

    4. 구조체 필드 또는 맵 키 참조

      식별자가 정규화된 경우 다음 단계에 따라 식별자를 필드 또는 맵 키와 일치시키세요.

      A. 마지막 식별자를 제거하고 필드 또는 키로 처리합니다. B. FROM clause테이블 참조에 있는 열과 나머지를 일치시킵니다.

      일치하는 항목이 두 개 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류가 발생합니다.

      일치 항목이 있고 열이 다음과 같은 경우:

      • STRUCT: 필드를 일치시킵니다.

        필드를 일치시킬 수 없으면 FIELD_NOT_FOUND 오류를 발생시킵니다.

        필드가 둘 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.

      • MAP: 키가 정규화되면 오류를 발생시킵니다.

        키가 맵에 실제로 존재하지 않으면 런타임 오류가 발생할 수 있습니다.

      • 기타 형식: 오류를 발생시킵니다. C. 앞의 단계를 반복하여 후행 식별자를 필드로 제거합니다. 열로 해석할 식별자가 남아 있는 동안 규칙(A) 및(B)를 적용합니다.

  2. 측면 열 별칭

    적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 12.2 LTS 이상

    식이 목록 내에 있는 SELECT 경우 선행 식별자를 해당 SELECT 목록의 이전 열 별칭과 일치합니다.

    일치하는 항목이 두 개 이상 있으면 AMBIGUOUS_LATERAL_COLUMN_ALIAS 오류가 발생합니다.

    나머지 각 식별자를 필드 또는 맵 키로 일치시키고 일치할 수 없는 경우 FIELD_NOT_FOUND 또는 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.

  3. 상관 관계

    • 측면

      쿼리 앞에 LATERAL 키워드가 있으면 쿼리를 포함하고 LATERAL 앞에 오는 FROM의 테이블 참조를 고려하여 규칙 1.a 및 1.d를 적용합니다.

    • Regular

      쿼리가 스칼라 하위 쿼리인 경우 IN 또는 EXISTS 하위 쿼리는 포함하는 쿼리의 FROM 절에 있는 테이블 참조를 고려하여 규칙 1.a, 1.d 및 2를 적용합니다.

  4. 중첩된 상관 관계

    쿼리의 중첩 수준을 반복하는 규칙 3을 다시 적용합니다.

  5. 루틴 매개 변수

    식이 CREATE FUNCTION 문의 일부인 경우:

    1. 식별자를 매개 변수 이름과 일치시킵니다. 식별자가 정규화된 경우 한정자는 함수 이름과 일치해야 합니다.
    2. 식별자가 정규화된 경우 규칙 1.c에 따라 매개 변수의 필드 또는 맵 키와 일치합니다.
  6. 변수

    1. 식별자를 변수 이름과 일치합니다. 식별자가 한정된 경우 한정자는 system.session>이어야 session 합니다.
    2. 식별자가 정규화된 경우 규칙 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()의 결과로 추가로 한정됩니다.

  • 정규화되지 않음

    1. 공통 테이블 식

      참조가 WITH 절의 범위 내에 있는 경우 바로 포함된 WITH 절에서 시작하여 바깥쪽으로 이동하는 CTE에 식별자를 일치시킵니다.

    2. 임시 뷰

      현재 세션 내에 정의된 임시 뷰에 식별자를 일치시킵니다.

    3. 지속형 테이블

      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)를 따릅니다.

    1. 기본 제공 함수

      이 이름의 함수가 기본 제공 함수 집합에 존재하면 해당 함수가 선택됩니다.

    2. 임시 함수

      이 이름의 함수가 임시 함수 집합에 있으면 해당 함수가 선택됩니다.

    3. 지속형 함수

      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