SnowConvert AI - Hive - SELECT

Applies to
  • Hive SQL

  • Spark SQL

  • Databricks SQL

설명

Spark는 SELECT 문을 지원하고 ANSI SQL 표준을 준수합니다. 쿼리는 하나 이상의 테이블에서 결과 세트를 검색하는 데 사용됩니다. (Spark SQL 언어 참조 SELECT)

경고

이 문법은 Snowflake에서 부분적으로 지원됩니다. 다음 CREATE VIEW 요소에 대한 변환은 보류 중입니다.

[ SORT BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
[ CLUSTER BY { expression [ , ... ] } ]
[ DISTRIBUTE BY { expression [, ... ] } ]
[ WINDOW { named_window [ , WINDOW named_window, ... ] } ]
[ PIVOT clause ]
[ UNPIVOT clause ]
[ LATERAL VIEW clause ] [ ... ]
[ regex_column_names ]
[ TRANSFORM (...) ]
[ LIMIT non_literal_expression ]

from_item :=
join_relation
table_value_function
LATERAL(subquery)
file_format.`file_path`

select_statement { INTERSECT | EXCEPT } { ALL | DISTINCT } select_statement
Copy

문법 구문

[ WITH with_query [ , ... ] ]
select_statement [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select_statement, ... ]
    [ ORDER BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
    [ SORT BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
    [ CLUSTER BY { expression [ , ... ] } ]
    [ DISTRIBUTE BY { expression [, ... ] } ]
    [ WINDOW { named_window [ , WINDOW named_window, ... ] } ]
    [ LIMIT { ALL | expression } ]

select_statement :=
SELECT [ hints , ... ] [ ALL | DISTINCT ] { [ [ named_expression | regex_column_names ] [ , ... ] | TRANSFORM (...) ] }
    FROM { from_item [ , ... ] }
    [ PIVOT clause ]
    [ UNPIVOT clause ]
    [ LATERAL VIEW clause ] [ ... ] 
    [ WHERE boolean_expression ]
    [ GROUP BY expression [ , ... ] ]
    [ HAVING boolean_expression ]
    
with_query :=
expression_name [ ( column_name [ , ... ] ) ] [ AS ] ( query )

from_item :=
table_relation |
join_relation |
table_value_function |
inline_table |
LATERAL(subquery) |
file_format.`file_path` 
Copy

샘플 소스 패턴

GROUP BY

WITH { CUBE | ROLLUP } 구문은 동등한 CUBE(expr1, ...) 또는 ROLLUP(expr1, ...)으로 변환됩니다.

입력 코드:

-- Basic case of GROUP BY
SELECT id, sum(quantity) FROM dealer GROUP BY 1;

-- Grouping by GROUPING SETS
SELECT city, car_model, sum(quantity) AS sum FROM dealer
    GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), ());

-- Grouping by ROLLUP
SELECT city, car_model, sum(quantity) AS sum FROM dealer
    GROUP BY ROLLUP(city, car_model);

SELECT city, car_model, sum(quantity) AS sum FROM dealer
    GROUP BY city, car_model WITH ROLLUP;

-- Grouping by CUBE
SELECT city, car_model, sum(quantity) AS sum FROM dealer
    GROUP BY CUBE(city, car_model);

SELECT city, car_model, sum(quantity) AS sum FROM dealer
    GROUP BY city, car_model WITH CUBE;
Copy

출력 코드:

-- Basic case of GROUP BY
SELECT id,
    SUM(quantity) FROM
    dealer
GROUP BY 1;

-- Grouping by GROUPING SETS
SELECT city, car_model,
    SUM(quantity) AS sum FROM
    dealer
    GROUP BY GROUPING SETS ((city, car_model), (city), (car_model), () !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'EmptyGroupingSet' NODE ***/!!!);

-- Grouping by ROLLUP
SELECT city, car_model,
    SUM(quantity) AS sum FROM
    dealer
    GROUP BY
    ROLLUP(city, car_model);

SELECT city, car_model,
    SUM(quantity) AS sum FROM
    dealer
GROUP BY
    ROLLUP(city, car_model);

-- Grouping by CUBE
SELECT city, car_model,
    SUM(quantity) AS sum FROM
    dealer
    GROUP BY CUBE(city, car_model) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CUBE' NODE ***/!!!;

SELECT city, car_model,
    SUM(quantity) AS sum FROM
    dealer
GROUP BY
    CUBE(city, car_model);
Copy

힌트

Snowflake는 JOINs 및 분할의 자동 최적화를 수행하며 즉, 힌트가 필요하지 않으므로 출력 코드에서 주석으로 유지됩니다.

입력 코드:

SELECT
/*+ REBALANCE */ /*+ COALESCE(2) */
*
FROM my_table;
Copy

출력 코드:

SELECT
/*+ REBALANCE */ /*+ COALESCE(2) */
*
FROM
my_table;
Copy

CTE

Spark/Databricks에서는 AS 키워드가 선택 사항이지만, Snowflake에서는 필수이므로 추가됩니다.

입력 코드:

WITH my_cte (
   SELECT id, name FROM my_table
)
SELECT *
FROM my_cte
WHERE id = 1;
Copy

출력 코드:

WITH my_cte AS (
     SELECT id, name FROM
        my_table
  )
SELECT *
FROM
     my_cte
WHERE id = 1;
Copy

LIMIT

LIMIT ALL은 Snowflake에서 필요하지 않으므로 제거됩니다. 리터럴 값이 있는 LIMIT는 있는 그대로 유지됩니다.

입력 코드:

SELECT * FROM my_table LIMIT ALL;

SELECT * FROM my_table LIMIT 5;
Copy

출력 코드:

SELECT * FROM
my_table;

SELECT * FROM
my_table
LIMIT 5;
Copy

ORDER BY

참고

이 절은 Snowflake에서 완전히 지원됩니다.

WHERE

참고

이 절은 Snowflake에서 완전히 지원됩니다.

HAVING

참고

이 절은 Snowflake에서 완전히 지원됩니다.

FROM table_relation

참고

이 절은 Snowflake에서 완전히 지원됩니다.

FROM inline_table

참고

이 절은 Snowflake에서 완전히 지원됩니다.

UNION [ALL | DISTINCT]

참고

이 절은 Snowflake에서 완전히 지원됩니다.

INTERSECT(키워드 없음)

참고

이 절은 Snowflake에서 완전히 지원됩니다.

EXCEPT(키워드 없음)

참고

이 절은 Snowflake에서 완전히 지원됩니다.