다음을 통해 공유


이름 확인

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

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

Column, 필드, 매개 변수 및 변수 해결

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

  • Column 이름 뷰, table, CTE(공용 table 식) 또는 column_alias기반으로 합니다.
  • 구조체 또는 맵 내의 필드 이름 또는 맵 키. 필드와 키는 정규화되지 않을 수 없습니다.
  • SQL 사용자 정의 함수매개 변수 이름.
  • 변수 이름입니다.
  • current_user를 사용할 필요가 없는 current_date 또는 ()와 같은 특수 함수.
  • column 또는 변수 값을 기본값으로 setINSERT, UPDATE, MERGE또는 SET VARIABLE 컨텍스트에서 사용되는 DEFAULT 키워드입니다.

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

  • 가장 가깝게 일치하는 참조가 사용되고
  • Columns 및 매개 변수가 필드 및 키보다 우위를 점합니다.

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

  1. 로컬 참조

    1. Column 참조

      자격이 부여될 수 있는 identifier을(를) FROM clausetable 참조 내 column 이름과 일치시킵니다.

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

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

      identifier가 자격이 없고 current_user, current_date또는 current_timestamp와 일치하는 경우: 이 함수 중 하나로 결정합니다.

    3. Column DEFAULT 사양

      identifier가 정규화되지 않은 경우, default과 일치하고 UPDATE SET, INSERT VALUES또는 MERGE WHEN [NOT] MATCHED컨텍스트에서 전체 식을 구성하며, 해당 INSERT, UPDATE 또는 MERGE의 목표 table의 DEFAULT 값으로 해석합니다.

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

      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)를 적용합니다.

  2. 횡적 column 에일리어싱

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

    표현식이 SELECTlist내에 있는 경우, identifier를 앞서 나오는 column 별칭와 그 SELECTlist내에서 일치시킵니다.

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

    나머지 각 identifier를 필드 또는 맵의 키로 일치시키며, 일치 시킬 수 없는 경우에는 FIELD_NOT_FOUND 또는 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.

  3. 상관 관계

    • 옆의

      쿼리 앞에 LATERAL 키워드가 있는 경우, 쿼리를 포함하고 LATERAL앞에 위치한 FROM 안의 table 참조를 고려하여 규칙 1.a와 1.d를 적용합니다.

    • Regular

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

  4. 중첩된 상관 관계

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

  5. 루틴 parameters

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

    1. identifier을(를) 매개 변수 이름에 일치시키세요. identifier가 자격을 갖춘 경우, 한정자는 함수의 이름과 일치해야 합니다.
    2. identifier가 자격이 있는 경우, 규칙 1.c에 따라 매개 변수의 필드 또는 맵 키와 일치시킵니다.
  6. 변수

    1. identifier을 변수 이름와 일치시키세요. identifier 정규화된 경우 한정자는 session 또는 system.session합니다.
    2. identifier가 적격인 경우, 규칙 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 및 화면 해상도

identifier는 table참조에서 다음 중 하나일 수 있습니다.

  • Unity Catalog 또는 Hive Metastore에서의 영구 table 또는 보기
  • 일반적인 table 표현 (CTE)
  • 임시 뷰

identifier 해결은 자격을 갖췄는지 여부에 따라 달라집니다.

  • 우량

    identifier가 세 부분인 catalog.schema.relation로 완전히 정규화되면, 이는 고유합니다.

    identifier가 두 부분으로 이루어져 있을 경우, schema.relationSELECT current_catalog()의 결과로 추가로 보완하여 고유하게 만듭니다.

  • 정규화되지 않음

    1. 일반적인 table 식

      참조가 WITH 절의 범위 내에 있는 경우, identifier을 CTE에 맞추되 즉시 포함된 WITH 절에서 시작하여 그로부터 바깥쪽으로 이동하며 일치시킵니다.

    2. 임시 뷰

      identifier을 현재 세션 내에 정의된 임시 뷰 중 하나와 일치시키십시오.

    3. 지속형 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)를 따릅니다.

    1. 기본 제공 함수

      이 이름의 함수가 기본 제공 함수의 set 사이에 있으면 해당 함수가 선택됩니다.

    2. 임시 함수

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

    3. 지속형 함수

      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