다음을 통해 공유


이름 확인

적용 대상:예로 표시된 확인 Databricks SQL 예로 표시된 확인 Databricks Runtime

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

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

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

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

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

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

  1. 로컬 참조

    1. 열 참조

      자격이 있을 수 있는 식별자를 FROM clause과 열 이름에 맞춥니다.

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

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

      식별자가 특정되지 않고 current_user, current_date또는 current_timestamp와 일치하면: 이러한 함수 중 하나로 해결합니다.

    3. 열 기본값 사양

      식별자가 정규화되지 않았고 default과 일치하며 UPDATE SET, INSERT VALUES, 또는 MERGE WHEN [NOT] MATCHED컨텍스트에서 전체 표현식을 구성하는 경우: 해당 DEFAULT, INSERT, 또는 UPDATE의 대상 테이블의 MERGE 값으로 해석합니다.

    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 키워드가 있는 경우, 쿼리를 포함하고 FROM앞에 위치한 LATERAL 테이블 참조를 고려하여 규칙 1.a 및 1.d를 적용합니다.

    • Regular

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

  4. 중첩된 상관 관계

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

  5. 루틴 매개 변수

    표현이 CREATE FUNCTION 문의 일부인 경우:

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

    1. 식별자를 변수 이름에 맞추세요. 식별자가 정규화된 경우 한정자는 session 또는 system.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

테이블 및 뷰 해상도

테이블 참조의 식별자은 다음 중 하나일 수 있습니다.

  • Unity 카탈로그 또는 Hive 메타스토어에 저장된 영구 테이블 또는 뷰
  • 공통 테이블 표현식 (CTE)
  • 임시 뷰

식별자의 확인은 자격이 있는지 여부에 따라 달라집니다.

  • 우량

    식별자가 세 부분으로 정규화된 경우, 예를 들어 catalog.schema.relation, 고유합니다.

    식별자가 schema.relation으로 두 부분으로 구성되어 있을 경우, 고유하게 되도록 SELECT current_catalog() 결과로 추가로 특정하게 만듭니다.

  • 정규화되지 않음

    1. 공통 테이블 식

      참조가 WITH 절의 범위 내에 있는 경우, 식별자를 CTE와 매칭하기 위해 먼저 즉시 포함하는 WITH 절에서 시작하여 그곳에서부터 바깥쪽으로 이동합니다.

    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