SnowConvert: Redshift SQL 문

CALL

설명

저장 프로시저를 실행합니다. CALL 명령에는 프로시저 이름과 입력 인자 값이 포함되어야 합니다. CALL 문을 사용하여 저장 프로시저를 호출해야 합니다. (Redshift SQL Language Reference CALL).

경고

이 구문은 Snowflake에서 부분적으로 지원됩니다. 출력 매개 변수를 사용하는 프로시저 호출에는 SSC-EWI-0073 태그가 지정됩니다. 이 변환은 향후에 제공될 예정입니다.

문법 구문

 CALL sp_name ( [ argument ] [, ...] )
Copy

샘플 소스 패턴

기본 시나리오

입력 코드:
 CREATE PROCEDURE sp_insert_values(IN arg1 INT, IN arg2 DATE)
LANGUAGE plpgsql
AS
$$
BEGIN
    INSERT INTO event VALUES (arg1, arg2);
END;
$$;

CALL sp_insert_values(1, CURRENT_DATE);
Copy
출력 코드:
 CREATE PROCEDURE sp_insert_values (arg1 INT, arg2 DATE)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/14/2025",  "domain": "test" }}'
AS
$$
BEGIN
    INSERT INTO event
    VALUES (:arg1, : arg2);
END;
$$;

CALL sp_insert_values(1, CURRENT_DATE());
Copy

출력 매개 변수 모드(INOUT, OUT)를 사용하여 호출

입력 코드:
 CREATE OR REPLACE PROCEDURE sp_calculate_sum_product(IN a NUMERIC, IN b NUMERIC, INOUT sum_result NUMERIC, INOUT product_result NUMERIC)
LANGUAGE plpgsql
AS $$
BEGIN
    sum_result := a + b;
    product_result := a * b;
END;
$$;

CREATE OR REPLACE PROCEDURE call_sp_calculate_sum_product()
LANGUAGE plpgsql
AS $$
DECLARE
    sum_value NUMERIC DEFAULT null;
    product_value NUMERIC DEFAULT null;
BEGIN
    CALL sp_calculate_sum_product(FLOOR(20.5)::NUMERIC, CEIL(20.7)::NUMERIC, sum_value, product_value);
    INSERT INTO test VALUES (sum_value, product_value);
END;
$$;

CALL call_sp_calculate_sum_product();
Copy
출력 코드:
 CREATE OR REPLACE PROCEDURE sp_calculate_sum_product (a NUMERIC, b NUMERIC, sum_result NUMERIC, product_result NUMERIC)
RETURNS VARIANT
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/14/2025",  "domain": "test" }}'
AS $$
BEGIN
    sum_result := a + b;
    product_result := a * b;
    RETURN OBJECT_CONSTRUCT('sum_result', :sum_result, 'product_result', :product_result);
END;
$$;

CREATE OR REPLACE PROCEDURE call_sp_calculate_sum_product ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/14/2025",  "domain": "test" }}'
AS $$
DECLARE
    sum_value NUMERIC DEFAULT NULL;
    product_value NUMERIC DEFAULT NULL;
BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CALL' NODE ***/!!!
    CALL sp_calculate_sum_product(FLOOR(20.5), CEIL(20.7), sum_value, product_value);
    INSERT INTO test
    VALUES (:sum_value, : product_value);
END;
$$;

CALL call_sp_calculate_sum_product();
Copy

Known Issues

  • 출력 매개 변수는 현재 프로시저 호출에서 지원되지 않습니다.

CREATE DATABASE

문법 구문

 CREATE DATABASE database_name 
[ { [ WITH ]
    [ OWNER [=] db_owner ]
    [ CONNECTION LIMIT { limit | UNLIMITED } ]
    [ COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE } ]
    [ ISOLATION LEVEL { SERIALIZABLE | SNAPSHOT } ]
  }
  | { [ WITH PERMISSIONS ] FROM DATASHARE datashare_name ] OF [ ACCOUNT account_id ] NAMESPACE namespace_guid }
  | { FROM { { ARN '<arn>' } { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA } }
             | { INTEGRATION '<integration_id>'} }
  | { IAM_ROLE  {default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' } }
Copy

자세한 내용은 Redshift CREATE DATABASE 설명서를 참조하십시오.

샘플 소스 패턴

기본 샘플

입력 코드:
 CREATE DATABASE database_name;
Copy
출력 코드:
 CREATE DATABASE IF NOT EXISTS database_name
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/25/2024" }}';
Copy

데이터 정렬 절

입력 코드:
 CREATE DATABASE database_collate
COLLATE CASE_INSENSITIVE;
Copy
출력 코드:
 CREATE DATABASE IF NOT EXISTS database_collate
DEFAULT_DDL_COLLATION='en-ci'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/24/2024" }}';
Copy

연결 제한 절

입력 코드:
 CREATE DATABASE database_connection
CONNECTION LIMIT UNLIMITED;
Copy
출력 코드:
 CREATE DATABASE IF NOT EXISTS database_connection
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/24/2024" }}';
Copy

경고

연결 제한 절은 Snowflake의 연결 동시성이 웨어하우스에서 관리되므로 제거되었습니다. 자세한 내용은 여기 를 참조하십시오.

From ARN 절

입력 코드:
 CREATE DATABASE database_fromARN
FROM ARN 'arn' WITH NO DATA CATALOG SCHEMA IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name';
Copy
출력 코드:
 CREATE DATABASE IF NOT EXISTS database_fromARN
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/24/2024" }}';
Copy

경고

이 절은 Amazon 리소스 를 참조하는 데 사용되며, Snowflake에서는 유효하지 않으므로 제거되었습니다.

From Datashare 절

입력 코드
 CREATE DATABASE database_fromDatashare
FROM DATASHARE datashare_name OF NAMESPACE 'namespace_guid';
Copy
출력 코드
 CREATE DATABASE IF NOT EXISTS  database_fromDatashare
FROM DATASHARE datashare_name OF NAMESPACE 'namespace_guid' !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'FromDatashareAttribute' NODE ***/!!!
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/24/2024" }}';
Copy

참고

Datashare의 변환은 향후 제공될 계획입니다.

Owner 절

입력 코드
 CREATE DATABASE database_Owner
OWNER db_owner
ENCODING 'encoding';
Copy
출력 코드
 CREATE DATABASE IF NOT EXISTS database_Owner
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/24/2024" }}';
Copy

경고

이 경우에는 개별 사용자가 아닌 역할별로 Snowflake 데이터베이스를 소유하기 때문에 코드에서 소유자 절이 제거됩니다. 자세한 내용은 Snowflake GRANT OWNERSHIP 설명서 를 참조하십시오.

Isolation Level 절

입력 코드
 CREATE DATABASE database_Isolation
ISOLATION LEVEL SNAPSHOT;
Copy
출력 코드
 CREATE DATABASE IF NOT EXISTS database_Isolation
ISOLATION LEVEL SNAPSHOT !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'IsolationLevelAttribute' NODE ***/!!!
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/24/2024" }}';
Copy

참고

Isolation Level에 대한 변환은 향후 제공될 계획입니다.

관련 EWIs

CREATE EXTERNAL TABLE

설명

현재 Snowconvert는 CREATE EXTERNAL TABLES 을 일반 테이블로 변환하고 있으며, 외부 RedShift 테이블에 저장된 데이터를 Snowflake 데이터베이스로 전송해야 하므로 추가적인 작업이 필요합니다.

문법 구문

 CREATE EXTERNAL TABLE
external_schema.table_name
(column_name data_type [, ] )
[ PARTITIONED BY (col_name data_type [,  ] )]
[ { ROW FORMAT DELIMITED row_format |
  ROW FORMAT SERDE 'serde_name'
  [ WITH SERDEPROPERTIES ( 'property_name' = 'property_value' [, ...] ) ] } ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]

CREATE EXTERNAL TABLE
external_schema.table_name
[ PARTITIONED BY (col_name [,  ] ) ]
[ ROW FORMAT DELIMITED row_format ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
 AS
 { select_statement }
Copy

여기를 클릭하여 이 구문에 대한 사양으로 이동합니다.

샘플 소스 패턴

입력 코드:

 CREATE EXTERNAL TABLE
external_schema.sales_data
(
    sales_id INT,
    product_id INT,
    sales_amount DECIMAL(10, 2),
    sales_date DATE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION 's3://mybucket/sales_data/';
Copy
출력 코드:
 --** SSC-FDM-0004 - EXTERNAL TABLE TRANSLATED TO REGULAR TABLE **
CREATE TABLE external_schema.sales_data
(
    sales_id INT,
    product_id INT,
    sales_amount DECIMAL(10, 2),
    sales_date DATE
)
--ROW FORMAT DELIMITED
--FIELDS TERMINATED BY ','
--STORED AS TEXTFILE
--LOCATION 's3://mybucket/sales_data/'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
;
Copy

Create External Table AS

입력 코드:
 CREATE EXTERNAL TABLE spectrum.partitioned_lineitem
PARTITIONED BY (l_shipdate, l_shipmode)
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/partitioned_lineitem/'
AS SELECT l_orderkey, l_shipmode, l_shipdate, l_partkey FROM local_table;
Copy
출력 코드:
 --** SSC-FDM-0004 - EXTERNAL TABLE TRANSLATED TO REGULAR TABLE **
CREATE TABLE spectrum.partitioned_lineitem
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
--PARTITIONED BY (l_shipdate, l_shipmode)
--STORED AS parquet
--LOCATION 'S3://amzn-s3-demo-bucket/cetas/partitioned_lineitem/'
AS SELECT l_orderkey, l_shipmode, l_shipdate, l_partkey FROM
local_table;
Copy

권장 사항

관련 EWIs

  1. SSC-FDM-0004: 외부 테이블이 일반 테이블로 변환되었습니다.

CREATE MATERIALIZED VIEW

설명

Snowconvert에서 Redshift 구체화된 뷰는 Snowflake 동적 테이블로 변환됩니다. 동적 테이블을 올바르게 구성하려면 2개의 필수 매개 변수 TARGET_LAG 및 WAREHOUSE 를 정의해야 합니다. 구성 옵션에서 이러한 매개 변수를 지정하지 않으면 아래 예시와 같이 변환 중에 기본값이 미리 지정된 값으로 설정됩니다.

구체화된 뷰에 대한 자세한 내용을 보려면 여기 를 클릭하십시오.

동적 테이블에 필요한 매개 변수에 대한 자세한 내용을 보려면 여기 를 클릭하십시오.

문법 구문

다음은 Amazon Redshift에서 뷰를 만드는 SQL 구문입니다. 여기 를 클릭하여 이 구문에 대한 Redshifts 사양으로 이동합니다.

 CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query          
Copy

샘플 소스 패턴

입력 코드:

 CREATE MATERIALIZED VIEW mv_baseball AS
SELECT ball AS baseball FROM baseball_table;
Copy
출력 코드:
 CREATE DYNAMIC TABLE mv_baseball
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "11/26/2024",  "domain": "test" }}'
AS
    SELECT ball AS baseball FROM
        baseball_table;
Copy

참고

테이블 특성 설명서는 다음 설명서를 확인하면 됩니다.

경고

BACKUP 및 AUTO REFRESH 절은 Snowflake의 동적 테이블에 적용할 수 없으므로 삭제됩니다

관련 Ewis

  • SSC-FDM-0031: 기본적으로 설정된 동적 테이블 필수 매개 변수

CREATE SCHEMA

문법 구문

 CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ]
           [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]

CREATE SCHEMA AUTHORIZATION username [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] 
[ schema_element [ ... ] ]
Copy

자세한 내용은 Redshift CREATE SCHEMA 설명서를 참조하십시오.

샘플 소스 패턴

기본 샘플

입력 코드:
 CREATE SCHEMA s1;

CREATE SCHEMA IF NOT EXISTS s2;

CREATE SCHEMA s3
CREATE TABLE t1
(
    col1 INT
)
CREATE VIEW v1 AS SELECT * FROM t1;
Copy
출력 코드:
 CREATE SCHEMA IF NOT EXISTS s1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;

CREATE SCHEMA IF NOT EXISTS s2
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;

CREATE SCHEMA IF NOT EXISTS s3
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;
CREATE TABLE t1
(
    col1 INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;
CREATE VIEW v1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
AS SELECT * FROM
    t1;
Copy

Authorization 절

입력 코드:
 CREATE SCHEMA s1 AUTHORIZATION miller;
Copy
출력 코드:
 CREATE SCHEMA IF NOT EXISTS s1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;
Copy

경고

이 경우에는 개별 사용자가 아닌 역할이 Snowflake 스키마를 소유하므로 코드에서 승인 절이 제거됩니다. 자세한 내용은 Snowflake GRANT OWNERSHIP 설명서 를 참조하십시오.

Quota 절

입력 코드:
 CREATE SCHEMA s1 QUOTA UNLIMITED;

CREATE SCHEMA s2 QUOTA 10 TB;
Copy
출력 코드:
 CREATE SCHEMA IF NOT EXISTS s1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;

CREATE SCHEMA IF NOT EXISTS s2
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;
Copy

참고

Snowflake에서는 계획당 할당량을 정의할 수 없습니다. 저장소 관리는 계정과 웨어하우스 수준에서 수행되며, Snowflake가 자동으로 처리합니다. 이러한 이유로 코드에서 제거되었습니다.

스키마 승인 생성하기

스키마 이름이 지정되지 않았지만 승인 절이 정의된 경우 Redshift에서 소유자 이름으로 새 스키마가 생성됩니다. 이러한 이유로 이 동작은 Snowflake에서 복제됩니다.

입력 코드:
 CREATE SCHEMA AUTHORIZATION miller;
Copy
출력 코드:
 CREATE SCHEMA IF NOT EXISTS miller
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/23/2024" }}'
;
Copy

관련 EWIs

알려진 문제는 없습니다.

CREATE VIEW

설명

이 명령은 데이터베이스에 뷰를 생성하며, 쿼리에서 뷰가 참조될 때마다 실행됩니다. WITH NO SCHEMA BINDING 절을 사용하여 아직 존재하지 않는 외부 테이블이나 오브젝트에 대한 뷰를 생성할 수 있습니다. 그러나 이 절에서는 참조하는 오브젝트 또는 테이블의 정규화된 이름을 지정해야 합니다.

문법 구문

다음은 Amazon Redshift에서 뷰를 만드는 SQL 구문입니다. 여기를 클릭하여 이 구문에 대한 Redshifts 사양으로 이동합니다.

 CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]               
Copy

샘플 소스 패턴

Redshifts 명령의 필수 절과 선택 절을 고려하면, Snowflake로 마이그레이션한 후의 출력은 매우 유사합니다.

입력 코드:

 CREATE VIEW myuser
AS 
SELECT lastname FROM users;


CREATE VIEW myuser2
AS 
SELECT lastname FROM users2
WITH NO SCHEMA BINDING;
Copy
출력 코드:
 CREATE VIEW myuser
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "01/16/2025",  "domain": "test" }}'
AS
SELECT lastname FROM
users;

CREATE VIEW myuser2
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "01/16/2025",  "domain": "test" }}'
AS
SELECT lastname FROM
users2
!!!RESOLVE EWI!!! /*** SSC-EWI-RS0003 - WITH NO SCHEMA BINDING STATEMENT CAN NOT BE REMOVED DUE TO MISSING REFERENCES. ***/!!!
WITH NO SCHEMA BINDING;
Copy

그러나 Redshift에서 지원되지 않는 한 절의 예외가 있으므로 이 경우를 처리하기 위해 EWI 를 구현했습니다.

관련 EWIs

  • SSC-EWI-RS0003: 스키마 바인딩 문이 없는 경우 Snowflake에서 지원되지 않습니다.

DELETE

설명

테이블에서 행을 삭제합니다. (Redshift SQL Language Reference 삭제 문).

이 구문은 Snowflake에서 완벽하게 지원됩니다.

Grammar Syntax

 [ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
    [ USING table_name, ... ]
    [ WHERE condition ]
Copy

Sample Source Patterns

설정 데이터

 CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    department VARCHAR(255),
    manager_id INT REFERENCES employees(id)
);

INSERT INTO employees (id, name, department, manager_id) VALUES
(1, 'Alice', 'Sales', 2),
(2, 'Bob', 'Sales', 1),
(3, 'Charlie', 'Sales', 1),
(4, 'David', 'Marketing', 2),
(5, 'Eve', 'Marketing', 4),
(6, 'Frank', 'Marketing', 4),
(7, 'Grace', 'Engineering', 6),
(8, 'Helen', 'Engineering', 7),
(9, 'Ivy', 'Engineering', 7),
(10, 'John', 'Sales', 3),
(11, 'Joe', 'Engineering', 5);


CREATE TABLE departments (
    department_name VARCHAR(255)
);

INSERT INTO departments (department_name) VALUES
('Sales'), 
('Marketing'), 
('Engineering');
Copy

From 절

다른 테이블의 정보를 참조하여 테이블을 업데이트합니다. Redshift에서 FROM 키워드는 선택 사항이지만 Snowflake에서는 필수입니다. 따라서 누락된 경우 추가됩니다.

Input Code:
 DELETE employees;

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

Output Code:
 DELETE FROM
    employees;
    
SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

Where 절

조건과 일치하는 행으로 업데이트를 제한합니다. 조건이 true를 반환하면 지정된 SET 열이 업데이트됩니다. 조건은 열에 대한 단순한 조건자이거나 하위 쿼리 결과에 기반한 조건일 수 있습니다. 이 절은 Snowflake에서도 완전히 동일합니다.

Input Code:
 DELETE FROM employees
WHERE department = 'Marketing';

SELECT * FROM employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

10

John

Sales

3

11

Joe

Engineering

5

Output Code:
 DELETE FROM
    employees
WHERE department = 'Marketing';

SELECT * FROM
    employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

10

John

Sales

3

11

Joe

Engineering

5

Using 절

이 절은 WHERE 절 조건에서 추가 테이블이 참조될 때 테이블 목록을 소개합니다. 이 절은 Snowflake에서도 완전히 동일합니다.

Input Code:
 DELETE FROM employees
USING departments d
WHERE employees.department = d.department_name
AND d.department_name = 'Sales';

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

마케팅

2

5

Eve

마케팅

4

6

Frank

마케팅

4

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

11

Joe

Engineering

5

Output Code:
 DELETE FROM employees
USING departments d
WHERE employees.department = d.department_name
AND d.department_name = 'Sales';

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

마케팅

2

5

Eve

마케팅

4

6

Frank

마케팅

4

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

11

Joe

Engineering

5

WITH 절

이 절은 1개 이상의 공통 테이블 식(CTE)을 지정합니다. 출력 열 이름은 비재귀적 CTEs 의 경우 선택 사항이지만 재귀적 열의 경우 필수입니다.

이 절은 DELETE 문에서는 사용할 수 없으므로 해당 쿼리와 함께 임시 테이블로 변환됩니다. DELETE 문이 실행되면 이러한 임시 테이블이 삭제되어 동일한 세션 내에서 테이블을 생성할 때 정리, 리소스 릴리스, 이름 충돌을 방지할 수 있습니다. 또한 같은 이름의 일반 테이블이 있는 경우 임시 테이블이 같은 세션에서 같은 이름의 다른 테이블보다 우선권 을 가지므로 임시 테이블이 다시 우선권을 갖습니다.

비재귀적 CTE
Input Code:
 WITH sales_employees AS (
    SELECT id
    FROM employees
    WHERE department = 'Sales'
), engineering_employees AS (
    SELECT id
    FROM employees
    WHERE department = 'Engineering'
)
DELETE FROM employees
WHERE id IN (SELECT id FROM sales_employees)
   OR id IN (SELECT id FROM engineering_employees);

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

마케팅

2

5

Eve

마케팅

4

6

Frank

마케팅

4

Output Code:
 CREATE TEMPORARY TABLE sales_employees AS
SELECT id
FROM employees
WHERE department = 'Sales';

CREATE TEMPORARY TABLE engineering_employees AS
SELECT id
FROM employees
WHERE department = 'Engineering';

DELETE FROM
    employees
WHERE id IN (SELECT id FROM sales_employees)
   OR id IN (SELECT id FROM engineering_employees);
   
DROP TABLE sales_employees;
DROP TABLE engineering_employees;

SELECT * FROM
    employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

마케팅

2

5

Eve

마케팅

4

6

Frank

마케팅

4

재귀 CTE
Input Code:
 WITH RECURSIVE subordinate_hierarchy(id, name, department, level) AS (
    SELECT id, name, department, 0 as level
    FROM employees
    WHERE department = 'Marketing'

    UNION ALL

    SELECT e.id, e.name, e.department, sh.level + 1
    FROM employees e
    INNER JOIN subordinate_hierarchy sh ON e.manager_id = sh.id
)
DELETE FROM employees
WHERE id IN (SELECT id FROM subordinate_hierarchy);
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

10

John

Sales

3

Output Code:
 CREATE TEMPORARY TABLE subordinate_hierarchy AS
   WITH RECURSIVE subordinate_hierarchy(id, name, department, level) AS (
       SELECT id, name, department, 0 as level
       FROM
           employees
       WHERE department = 'Marketing'

       UNION ALL

       SELECT e.id, e.name, e.department, sh.level + 1
       FROM
           employees e
       INNER JOIN
               subordinate_hierarchy sh ON e.manager_id = sh.id
   )
   SELECT
       id,
       name,
       department,
       level
   FROM
       subordinate_hierarchy;
       
   DELETE FROM
   employees
   WHERE id IN (SELECT id FROM
           subordinate_hierarchy
   );
   
   DROP TABLE subordinate_hierarchy;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

10

John

Sales

3

구체화된 뷰 삭제하기

Redshift에서는 DELETE 문을 스트림 수집 에 사용되는 구체화된 뷰에 적용할 수 있습니다. Snowflake에서는 이러한 뷰가 동적 테이블로 변환되며 DELETE 문은 동적 테이블에서 사용할 수 없습니다. 따라서 EWI 가 추가됩니다.

Input Code:
 CREATE MATERIALIZED VIEW emp_mv AS
SELECT id, name, department FROM employees WHERE department = 'Engineering';

DELETE FROM emp_mv
WHERE id = 2;
Copy
Output Code:
 CREATE DYNAMIC TABLE emp_mv
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "02/11/2025",  "domain": "test" }}'
AS
SELECT id, name, department FROM
employees
WHERE department = 'Engineering';
        
        
!!!RESOLVE EWI!!! /*** SSC-EWI-RS0008 - MATERIALIZED VIEW IS TRANSFORMED INTO A DYNAMIC TABLE, AND THE DELETE STATEMENT CANNOT BE USED ON DYNAMIC TABLES. ***/!!!
DELETE FROM
emp_mv
WHERE id = 2;
Copy

Known Issues

  • WITH 절의 기능을 복제하려면 각 공통 테이블 기능(CTE)를 미러링하는 임시 테이블을 만들어야 합니다. 그러나 현재 세션 내에 같은 이름의 임시 테이블이 이미 존재하는 경우 이 접근법은 실패하여 오류가 발생합니다.

Related EWIs

  1. SSC-FDM-0031: 기본적으로 설정된 동적 테이블 필수 매개 변수

  2. SSC-EWI-RS0008: 동적 테이블에는 Delete 문을 사용할 수 없습니다.

INSERT

Description

테이블에 새 행을 삽입합니다. (Redshift SQL Language Reference Insert 문).

경고

이 구문은 Snowflake에서 부분적으로 지원됩니다.

문법 구문

 INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
Copy

샘플 소스 패턴

설정 데이터

 CREATE TABLE employees (
    id INTEGER IDENTITY(1,1),
    name VARCHAR(100),
    salary INT DEFAULT 20000,
    department VARCHAR(50) DEFAULT 'Marketing'
);

CREATE TABLE new_employees (
    name VARCHAR(100),
    salary INT,
    department VARCHAR(50)
);

INSERT INTO new_employees (name, salary, department)
VALUES
    ('Grace Lee', 32000, 'Operations'),
    ('Hannah Gray', 26000, 'Finance');
Copy

기본값

기본값을 사용하여 전체 행을 삽입합니다. 기본값이 없는 열이 있는 경우 해당 열에 NULL 값이 삽입됩니다.

이 절은 개별 열을 지정할 수 없으며 항상 기본값을 사용하여 전체 행을 삽입합니다. 또한 NOT NULL 제약 조건이 있는 열은 테이블 정의에 포함할 수 없습니다. Snowflake에서 이 동작을 복제하려면 SnowConvert 는 테이블에 DEFAULT 값이 포함된 열을 삽입합니다. 이 작업은 모든 열에 기본값을 사용하여 전체 행을 삽입합니다.

입력 코드:
 CREATE TABLE employees (
    id INTEGER IDENTITY(1,1),
    name VARCHAR(100),
    salary INT DEFAULT 20000,
    department VARCHAR(50) DEFAULT 'Marketing'
);

INSERT INTO employees
DEFAULT VALUES;

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

SALARY

DEPARTMENT

1

NULL

20000

마케팅

출력 코드:
 CREATE TABLE employees (
    id INTEGER IDENTITY(1,1) ORDER,
    name VARCHAR(100),
    salary INT DEFAULT 20000,
    department VARCHAR(50) DEFAULT 'Marketing'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/03/2025",  "domain": "test" }}';

INSERT INTO employees (id)
VALUES (DEFAULT);

SELECT * FROM
    employees
ORDER BY id;
Copy

ID

NAME

SALARY

DEPARTMENT

1

NULL

20000

마케팅

쿼리

쿼리를 사용하여 테이블에 1개 이상의 행을 삽입합니다. 쿼리에 의해 생성된 모든 행이 테이블에 삽입됩니다. 쿼리는 테이블의 열과 호환되는 열 목록을 반환해야 하지만 열 이름이 일치할 필요는 없습니다. 이 기능은 Snowflake에서 완전히 동일합니다.

입력 코드:
 INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM new_employees;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Grace Lee

32000

작업

2

Hannah Gray

26000

Finance

출력 코드:
 INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM
    new_employees;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Grace Lee

32000

작업

2

Hannah Gray

26000

Finance

알려진 문제

  • 특정 식은 Snowflake의 VALUES 절에서 사용할 수 없습니다. 예를 들어, Redshift에서 JSON_PARSE 함수는 VALUES 절 내에서 JSON 값을 SUPER 데이터 타입에 삽입하는 데 사용할 수 있습니다. 그러나 Snowflake에서는 VALUES 절에서 PARSE_JSON 함수를 사용하여 JSON 값을 VARIANT 데이터 타입에 삽입할 수 없습니다. 대신에, VALUES 절 대신 쿼리를 사용할 수 있습니다. 자세한 내용은 Snowflake 설명서 를 참조하십시오. 자세한 내용은 다음 문서 에서도 확인할 수 있습니다.

관련 EWIs

알려진 문제는 없습니다.

MERGE

문법 구문

 MERGE INTO target_table 
USING source_table [ [ AS ] alias ] 
ON match_condition 
[ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) |
REMOVE DUPLICATES ]
Copy

자세한 내용은 Redshift MERGE 설명서 를 참조하십시오.

샘플 소스 패턴

UPDATE - INSERT

두 언어 간에는 차이가 없습니다. 코드는 원래 형태로 유지됩니다.

입력 코드:
 MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
Copy
출력 코드:
 --** SSC-FDM-RS0005 - REDSHIFT MERGE STATEMENT DOESN'T ALLOW DUPLICATES IN THE SOURCE TABLE. SNOWFLAKE BEHAVIOR MAY DIFFER IF THERE ARE DUPLICATE VALUES. **
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
Copy

DELETE - INSERT

두 언어 간에는 차이가 없습니다. 코드는 원래 형태로 유지됩니다.

입력 코드:
 MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
Copy
출력 코드:
 --** SSC-FDM-RS0005 - REDSHIFT MERGE STATEMENT DOESN'T ALLOW DUPLICATES IN THE SOURCE TABLE. SNOWFLAKE BEHAVIOR MAY DIFFER IF THERE ARE DUPLICATE VALUES. **
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
Copy

REMOVE DUPLICATES

REMOVE DUPLICATES 절은 Snowflake에서 지원되지 않지만 원래 동작을 에뮬레이션할 수 있는 해결 방법이 있습니다.

출력 코드에는 세 개의 새로운 문이 추가됩니다.

  • 조건과 일치하는 소스 및 대상 테이블의 중복 값이 있는 TEMPORARY TABLE

  • 병합 후 보류 중인 값을 대상 테이블에 추가하는 INSERT 문입니다

  • 생성된 임시 테이블을 삭제하는 DROP 문입니다.

DROP DUPLICATES 동작은 대상 테이블에서 중복 값을 제거한 다음 소스 테이블에서 조건과 일치하는 값을 삽입하므로 이러한 동작이 필요합니다.

입력 코드:
 CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;
Copy

ID

NAME

30

Daisy

22

Clarence

30

Tony

11

Alice

23

David

출력 코드:
 CREATE TABLE target (id INT, name CHAR(10))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/03/2025",  "domain": "test" }}';

CREATE TABLE source (id INT, name CHAR(10))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "03/03/2025",  "domain": "test" }}';

INSERT INTO target
VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki');

INSERT INTO source
VALUES (23, 'David'), (22, 'Clarence');

CREATE TEMPORARY TABLE source_duplicates AS
SELECT DISTINCT
source.*
FROM
source
INNER JOIN
target
ON target.id = source.id;
--** SSC-FDM-RS0005 - REDSHIFT MERGE STATEMENT DOESN'T ALLOW DUPLICATES IN THE SOURCE TABLE. SNOWFLAKE BEHAVIOR MAY DIFFER IF THERE ARE DUPLICATE VALUES. **
MERGE INTO target
USING source ON target.id = source.id
WHEN MATCHED THEN
DELETE
WHEN NOT MATCHED THEN
INSERT
VALUES (source.id, source.name);
INSERT INTO target

SELECT
*
FROM
source_duplicates;

DROP TABLE IF EXISTS source_duplicates CASCADE;
Copy

ID

NAME

22

Clarence

30

Tony

30

Daisy

11

Alice

23

David

Known Issues

알려진 문제는 없습니다.

관련 EWIs

  1. SSC-EWI-RS0009: 소스 테이블에 대한 의미 체계 정보를 찾을 수 없습니다.

  2. SSC-FDM-RS0005: 소스 테이블에 중복이 허용되지 않습니다.

UPDATE

설명

조건이 충족되면 1개 이상의 테이블 열의 값을 업데이트합니다. (Redshift SQL Language Reference Update 문).

이 구문은 Snowflake에서 완벽하게 지원됩니다.

Grammar Syntax

 [ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
            UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]

[ FROM fromlist ]
[ WHERE condition ]
Copy

Sample Source Patterns

Setup data

 CREATE TABLE employees (
    id INTEGER IDENTITY(1,1),
    name VARCHAR(100),
    salary DECIMAL DEFAULT 20000,
    department VARCHAR(50) DEFAULT 'Marketing'
);

INSERT INTO employees (name, salary, department)
VALUES
    ('Alice', 500000, 'HR'),
    ('Bob', 600000, 'Engineering'),
    ('Charlie', 700000, 'Engineering'),
    ('David', 400000, 'Marketing'),
    ('Eve', 450000, 'HR'),
    ('Frank', 750000, 'Engineering'),
    ('Grace', 650000, 'Engineering'),
    ('Helen', 390000, 'Marketing'),
    ('Ivy', 480000, 'HR'),
    ('Jack', 420000, 'Engineering'),
    ('Ken', 700000, 'Marketing'),
    ('Liam', 600000, 'Engineering'),
    ('Mona', 470000, 'HR');

CREATE TABLE department_bonus (
    department VARCHAR(100),
    bonus DECIMAL
);

INSERT INTO department_bonus (department, bonus)
VALUES
    ('HR', 10000),
    ('Engineering', 50000),
    ('Marketing', 20000),
    ('Sales', 5000);
Copy

별칭

Snowflake의 문법에는 테이블 별칭을 사용할 수 있다고 명시되어 있지 않지만 Snowflake에서는 유효한 코드입니다.

Input Code:
 UPDATE employees AS e
SET salary = salary + 5000
WHERE e.salary < 600000;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

505000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

405000

마케팅

5

Eve

455000

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

395000

마케팅

9

Ivy

485000

HR

10

Jack

425000

Engineering

11

Ken

700000

마케팅

12

Liam

600000

Engineering

13

Mona

475000

HR

Output Code:
 UPDATE employees AS e
SET salary = salary + 5000
WHERE e.salary < 600000;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

505000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

405000

마케팅

5

Eve

455000

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

395000

마케팅

9

Ivy

485000

HR

10

Jack

425000

Engineering

11

Ken

700000

마케팅

12

Liam

600000

Engineering

13

Mona

475000

HR

WITH clause

이 절은 1개 이상의 공통 테이블 식(CTE)을 지정합니다. 출력 열 이름은 비재귀적 CTEs 의 경우 선택 사항이지만 재귀적 열의 경우 필수입니다.

이 절은 UPDATE 문에서는 사용할 수 없으므로 해당 쿼리와 함께 임시 테이블로 변환됩니다. UPDATE 문이 실행되면 이러한 임시 테이블이 삭제되어 동일한 세션 내에서 테이블을 생성할 때 정리, 리소스 릴리스, 이름 충돌을 방지할 수 있습니다. 또한 같은 이름의 일반 테이블이 있는 경우 임시 테이블이 같은 세션에서 같은 이름의 다른 테이블보다 우선권 을 가지므로 임시 테이블이 다시 우선권을 갖습니다.

Non-Recursive CTE
Input Code:
 WITH avg_salary_cte AS (
    SELECT AVG(salary) AS avg_salary FROM employees
)
UPDATE employees
SET salary = (SELECT avg_salary FROM avg_salary_cte)
WHERE salary < 500000;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

500000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

546923

마케팅

5

Eve

546923

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

546923

마케팅

9

Ivy

546923

HR

10

Jack

546923

Engineering

11

Ken

700000

마케팅

12

Liam

600000

Engineering

13

Mona

546923

HR

Output Code:
 CREATE TEMPORARY TABLE avg_salary_cte AS
SELECT AVG(salary) AS avg_salary FROM
employees;

UPDATE employees
SET salary = (SELECT avg_salary FROM
      avg_salary_cte
)
WHERE salary < 500000;

DROP TABLE avg_salary_cte;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

500000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

546923

마케팅

5

Eve

546923

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

546923

마케팅

9

Ivy

546923

HR

10

Jack

546923

Engineering

11

Ken

700000

마케팅

12

Liam

600000

Engineering

13

Mona

546923

HR

Recursive CTE
Input Code:
 WITH RECURSIVE bonus_updates(id, name, department, salary, level) AS (
    SELECT e.id,
           e.name,
           e.department,
           e.salary + CASE
                          WHEN db.bonus IS NOT NULL THEN db.bonus
                          ELSE 0
               END AS new_salary,
           1 AS level
    FROM employees e
    LEFT JOIN department_bonus db ON e.department = db.department
    UNION ALL
    SELECT e.id,
           e.name,
           e.department,
           e.salary + CASE
                          WHEN db.bonus IS NOT NULL THEN db.bonus
                          ELSE 0
               END + (e.salary * 0.05) AS new_salary,
           bu.level + 1
    FROM employees e
    JOIN department_bonus db ON e.department = db.department
    JOIN bonus_updates bu ON e.id = bu.id
    WHERE bu.level < 3
)
UPDATE employees
SET salary = bu.new_salary
FROM (SELECT id, AVG(salary) as new_salary FROM bonus_updates GROUP BY id) as bu
WHERE employees.id = bu.id
  AND bu.new_salary > employees.salary;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

526666

HR

2

Bob

670000

Engineering

3

Charlie

773333

Engineering

4

David

433333

마케팅

5

Eve

475000

HR

6

Frank

825000

Engineering

7

Grace

721666

Engineering

8

Helen

423000

마케팅

9

Ivy

506000

HR

10

Jack

484000

Engineering

11

Ken

743333

마케팅

12

Liam

670000

Engineering

13

Mona

495668

HR

Output Code:
 CREATE TEMPORARY TABLE bonus_updates AS
  --** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "employees", "department_bonus" **
 WITH RECURSIVE bonus_updates(id, name, department, salary, level) AS (
     SELECT e.id,
            e.name,
            e.department,
            e.salary + CASE
                           WHEN db.bonus IS NOT NULL THEN db.bonus
                           ELSE 0
                END AS new_salary,
            1 AS level
     FROM
            employees e
     LEFT JOIN
                           department_bonus db ON e.department = db.department
     UNION ALL
     SELECT e.id,
            e.name,
            e.department,
            e.salary + CASE
                           WHEN db.bonus IS NOT NULL THEN db.bonus
                           ELSE 0
                END + (e.salary * 0.05) AS new_salary,
            bu.level + 1
     FROM
            employees e
     JOIN
                           department_bonus db ON e.department = db.department
     JOIN
                           bonus_updates bu ON e.id = bu.id
     WHERE bu.level < 3
 )
 SELECT
     id,
     name,
     department,
     salary,
     level
 FROM
     bonus_updates;
     
UPDATE employees
SET salary = bu.new_salary
FROM (SELECT id, AVG(salary) as new_salary 
FROM bonus_updates 
GROUP BY id) as bu
WHERE employees.id = bu.id
  AND bu.new_salary > employees.salary;
 
DROP TABLE bonus_updates;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

526667

HR

2

Bob

670000

Engineering

3

Charlie

773333

Engineering

4

David

433333

마케팅

5

Eve

475000

HR

6

Frank

825000

Engineering

7

Grace

721667

Engineering

8

Helen

423000

마케팅

9

Ivy

506000

HR

10

Jack

484000

Engineering

11

Ken

743333

마케팅

12

Liam

670000

Engineering

13

Mona

495667

HR

SET DEFAULT 값

Input Code:
 UPDATE employees
SET salary = DEFAULT, department = 'Sales'
WHERE department = 'HR';
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

20000

Sales

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

400000

마케팅

5

Eve

20000

Sales

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

390000

마케팅

9

Ivy

20000

Sales

10

Jack

420000

Engineering

11

Ken

700000

마케팅

12

Liam

600000

Engineering

13

Mona

20000

Sales

Output Code:
 UPDATE employees
SET salary = DEFAULT, department = 'Sales'
WHERE
    department = 'HR';
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

20000

Sales

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

400000

마케팅

5

Eve

20000

Sales

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

390000

마케팅

9

Ivy

20000

Sales

10

Jack

420000

Engineering

11

Ken

700000

마케팅

12

Liam

600000

Engineering

13

Mona

20000

Sales

SET 절

열의 값을 수정하는 역할을 합니다. Snowflake와 마찬가지로 행당 여러 개의 일치 항목이 있는 업데이트 쿼리는 구성 매개 변수 ERROR_ON_NONDETERMINISTIC_UPDATE 가 true로 설정된 경우 오류를 throw합니다. 이 플래그는 Snowflake에서도 동일한 방식으로 작동하며 ERROR_ON_NONDETERMINISTIC_UPDATE 라는 동일한 이름을 사용합니다.

그러나 이 플래그를 끄면 오류가 반환되지 않고 일치하는 행 중 하나가 대상 행을 업데이트하는 데 사용됩니다. 선택한 조인된 행은 두 언어 모두에서 비결정적이고 임의적이므로 동작이 실행 간에 일관되지 않을 수 있으며, 이로 인해 데이터 불일치가 발생할 수 있습니다.

설정 데이터:
 CREATE TABLE target (
  k INT,
  v INT
);

CREATE TABLE src (
  k INT,
  v INT
);

INSERT INTO target (k, v) VALUES (0, 10);

INSERT INTO src (k, v) VALUES
  (0, 14),
  (0, 15),
  (0, 16);
Copy
Input Code:
 UPDATE target
  SET v = src.v
  FROM src
  WHERE target.k = src.k;


SELECT * FROM target;
Copy

K

V

0

16

Output Code:
 UPDATE target
  SET v = src.v
  FROM src
  WHERE target.k = src.k;


SELECT * FROM target;
Copy

K

V

0

14

Known Issues

  • 행당 일치하는 항목이 여러 개 있는 업데이트 쿼리는 데이터 불일치를 일으킬 수 있습니다. 두 플랫폼 모두 ERROR_ON_NONDETERMINISTIC_UPDATE 플래그가 있지만, 이 값은 항상 비결정적입니다. Snowflake는 이러한 시나리오를 처리하기 위한 권장 사항을 제공합니다. 자세한 내용을 보려면 여기 를 클릭하십시오.

  • WITH 절의 기능을 복제하려면 각 공통 테이블 기능(CTE)를 미러링하는 임시 테이블을 만들어야 합니다. 그러나 현재 세션 내에 같은 이름의 임시 테이블이 이미 존재하는 경우 이 접근법은 실패하여 오류가 발생합니다.

Related EWIs

알려진 문제는 없습니다.

CREATE TABLE AS

Description

쿼리를 기반으로 새 테이블을 생성합니다. 이 테이블의 소유자는 명령을 실행하는 사용자입니다.

자세한 내용은 CREATE TABLE AS 설명서를 참조하십시오.

Grammar Syntax

 CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
[ ( column_name [, ... ] ) ]
[ BACKUP { YES | NO } ]
[ table_attributes ]
AS query

where table_attributes are:
[ DISTSTYLE { AUTO | EVEN | ALL | KEY } ]
[ DISTKEY( distkey_identifier ) ]
[ [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] ) ]   
Copy

테이블 시작: BACKUP

Description

Amazon Redshift가 테이블의 모든 열에 대한 인코딩 유형을 자동으로 조정하여 쿼리 성능을 최적화할 수 있도록 합니다. Snowflake에서는 다른 데이터베이스에서 볼 수 있는 BACKUP 개념이 직접 적용되지 않습니다. Snowflake는 Time Travel 및 Fail-safe와 같은 기본 제공 기능을 통해 데이터 백업 및 복구를 자동으로 처리하므로 수동 백업 작업이 필요하지 않습니다. 이러한 이유로 변환 프로세스 중에 BACKUP 문이 제거됩니다

여기 를 클릭하여 이 구문에 대한 Amazon Redshift 문서 페이지로 이동합니다.

Grammar Syntax

 BACKUP { YES | NO }
Copy

Sample Source Patterns

NO 옵션

기본적으로 Snowflake는 항상 생성된 테이블의 백업을 생성하므로 FDM 이 추가됩니다.

입력 코드:

 CREATE TABLE table1
BACKUP NO
AS SELECT * FROM table_test;
Copy

출력 코드:

 CREATE TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "02/10/2025",  "domain": "test" }}'
----** SSC-FDM-RS0001 - BACKUP NO OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--BACKUP NO
AS SELECT * FROM
table_test;
Copy
YES 옵션

기본적으로 Snowflake는 생성된 테이블에 백업을 적용하므로 이 옵션은 제거되었습니다.

입력 코드:

 CREATE TABLE table1
BACKUP YES
AS SELECT * FROM table_test;
Copy

출력 코드:

 CREATE TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "02/10/2025",  "domain": "test" }}'
AS SELECT * FROM
table_test;
Copy

Related EWIs

  • SSC-FDM-RS0001: “옵션”은 지원되지 않습니다. 데이터 저장소는 Snowflake에서 자동으로 처리합니다.

테이블 시작: COLUMNS

Description

새 테이블의 열 이름입니다. 열 이름이 제공되지 않으면 열 이름은 쿼리의 출력 열 이름에서 가져옵니다.

여기를 클릭하여 이 구문에 대한 Amazon Redshift 문서 페이지로 이동합니다.

Grammar Syntax

 ( column_name [, ... ] )
Copy

Sample Source Patterns

Input Code:
 CREATE TABLE table1 
(
    col1, col2, col3
)
AS SELECT col1, col2, col3 FROM table_test;
Copy

출력 코드:

 CREATE TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
(
    col1, col2, col3
)
AS SELECT col1, col2, col3 FROM
        table_test;
Copy

Related EWIs

알려진 문제는 없습니다.

테이블 시작: LOCAL

Description

Amazon Redshift에서 LOCAL TEMPORARY 또는 TEMP 은 세션 기간 동안만 존재하는 임시 테이블을 만드는 데 사용됩니다. 이러한 테이블은 세션별로 다르며 세션이 종료되면 자동으로 삭제됩니다. 영구 데이터베이스 스키마에 영향을 주지 않고 중간 결과 또는 작업 데이터를 저장하는 데 유용합니다.

여기를 클릭하여 이 구문에 대한 Amazon Redshift 문서 페이지로 이동합니다.

Grammar Syntax

 LOCAL { TEMPORARY | TEMP }
Copy

Sample Source Patterns

Input Code:
 CREATE LOCAL TEMP TABLE table1
AS SELECT FROM table_test;
Copy
Output Code:
 CREATE LOCAL TEMP TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
AS SELECT FROM
table_test;
Copy

Related EWIs

알려진 문제는 없습니다.

Tabla 특성: DISTKEY

Description

Amazon Redshift에서는 DISTKEY 를 사용하여 클러스터 노드 간에 데이터를 분산하여 쿼리 성능을 최적화합니다. 하지만 Snowflake는 명시적 배포 키 없이도 데이터 배포와 저장소를 자동으로 처리합니다. 아키텍처와 데이터 관리 접근법의 차이로 인해, Snowflake는 Redshift의 DISTKEY 와 직접적으로 동등한 기능을 가지고 있지 않습니다. 이러한 이유로 변환 프로세스 중에 DISTKEY 문이 제거됩니다

여기 를 클릭하여 이 구문에 대한 Amazon Redshift 문서 페이지로 이동합니다.

Grammar Syntax

 DISTKEY ( column_name )
Copy

Sample Source Patterns

Input Code:
 CREATE TABLE table1
DISTKEY (col1)
AS SELECT * FROM table_test;
Copy
Output Code:
 CREATE TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "02/10/2025",  "domain": "test" }}'
----** SSC-FDM-RS0001 - DISTKEY OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTKEY (col1)
AS SELECT * FROM
table_test;
Copy

Related EWIs

  • SSC-FDM-RS0001: “옵션”은 지원되지 않습니다. 데이터 저장소는 Snowflake에서 자동으로 처리합니다.

Tabla 특성: DISTSTYLE

Description

전체 테이블의 데이터 배포 스타일을 정의하는 키워드입니다.

여기 를 클릭하여 이 구문에 대한 Amazon Redshift 문서 페이지로 이동합니다.

Grammar Syntax

 DISTSTYLE { AUTO | EVEN | KEY | ALL }
Copy

Sample Source Patterns

Input Code:
 CREATE TABLE table1 
DISTSTYLE AUTO
AS SELECT * FROM table_test;

CREATE TABLE table2
DISTSTYLE EVEN
AS SELECT * FROM table_test;

CREATE TABLE table3
DISTSTYLE ALL
AS SELECT * FROM table_test;

CREATE TABLE table4
DISTSTYLE KEY
DISTKEY (col1)
AS SELECT * FROM table_test;
Copy
Output Code:
 CREATE TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
----** SSC-FDM-RS0001 - DISTSTYLE AUTO OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTSTYLE AUTO
AS SELECT * FROM
table_test;

CREATE TABLE table2
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
----** SSC-FDM-RS0001 - DISTSTYLE EVEN OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTSTYLE EVEN
AS SELECT * FROM
table_test;

CREATE TABLE table3
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
----** SSC-FDM-RS0001 - DISTSTYLE ALL OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTSTYLE ALL
AS SELECT * FROM
table_test;

CREATE TABLE table4
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
----** SSC-FDM-RS0001 - DISTSTYLE KEY OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTSTYLE KEY
----** SSC-FDM-RS0001 - DISTKEY OPTION NOT SUPPORTED. DATA STORAGE IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
--DISTKEY (col1)
AS SELECT * FROM
table_test;
Copy

Related EWIs

  1. SSC-FDM-RS0001: “옵션”은 지원되지 않습니다. 데이터 저장소는 Snowflake에서 자동으로 처리합니다.

Tabla 특성: SORTKEY

Description

열이 테이블의 정렬 키임을 지정하는 키워드입니다. 둘 다 쿼리 성능을 위해 데이터 저장소를 최적화하기 때문에 Snowflake에서 Redshift의 SORTKEYCLUSTERBY 로 마이그레이션할 수 있습니다. CLUSTERBY 는 Redshift의 SORTKEY 에서 데이터를 주문하는 방식과 유사하게 지정된 열에 대해 데이터를 조직화합니다.

여기 를 클릭하여 이 구문에 대한 Amazon Redshift 문서 페이지로 이동합니다.

Grammar Syntax

 [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] )
Copy

Sample Source Patterns

Input Code:
 CREATE TABLE table1 (
    col1,
    col2,
    col3,
    col4
)
COMPOUND SORTKEY (col1, col3)
AS SELECT * FROM table_test;

CREATE TABLE table2 (
    col1
)
INTERLEAVED SORTKEY (col1)
AS SELECT * FROM table_test;

CREATE TABLE table3 (
    col1
)
SORTKEY (col1)
AS SELECT * FROM table_test;
Copy
Output Code:
 CREATE TABLE table1
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
(
    col1,
    col2,
    col3,
    col4
)
--** SSC-FDM-RS0002 - THE PERFORMANCE OF THE CLUSTER BY MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY **
CLUSTER BY (col1, col3)
AS SELECT * FROM
        table_test;

CREATE TABLE table2
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
(
    col1
)
--** SSC-FDM-RS0002 - THE PERFORMANCE OF THE CLUSTER BY MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY **
CLUSTER BY (col1)
AS SELECT * FROM
        table_test;

CREATE TABLE table3
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "redshift",  "convertedOn": "09/17/2024" }}'
(
    col1
)
--** SSC-FDM-RS0002 - THE PERFORMANCE OF THE CLUSTER BY MAY VARY COMPARED TO THE PERFORMANCE OF SORTKEY **
CLUSTER BY (col1)
AS SELECT * FROM
        table_test;
Copy

Related EWIs

  1. SSC-FDM-RS0002: CLUSTER BY 의 성능은 Sortkey의 성능과 다를 수 있습니다.