SnowConvert: Redshift SQL ステートメント

CALL

説明

ストアドプロシージャを実行します。CALL コマンドには、プロシージャ名と入力引数の値を含める必要があります。ストアドプロシージャを呼び出すには、 CALL ステートメントを使用する必要があります。(Redshift SQL 言語リファレンス 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

既知の問題

  • 出力パラメーターは現在、プロシージャ呼び出しではサポートされていません。

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

Collate句

入力コード:
 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

Connection Limit句

入力コード:
 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の接続同時性はウェアハウスによって管理されるため、connection limit句は削除されます。詳細は こちら

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 Resources の参照に使用されており、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データベースは個々のユーザーではなくロールによって所有されるため、owner句はコードから削除されることに注意してください。詳細情報については、 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

外部テーブル作成 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。これらのパラメーターが構成オプションで指定されないままになっている場合、以下の例に示すように、Snowconvertは変換中にデフォルト値として事前に割り当てられた値を使用します。

マテリアライズドビューの詳細情報については、 こちら をクリックしてください。

動的テーブルに必要なパラメーターについては、 こちら をご覧ください。

文法構文

以下は、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の動的テーブルでは適用可能ではないため、削除されます

関連EWI

  • 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スキーマは個々のユーザーではなくロールによって所有されるため、authorization句はコードから削除されることに注意してください。詳細情報については、 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では、スキーマ名が指定されずauthorization句が定義されている場合、所有者の名前で新しいスキーマが作成されます。このため、この動作は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でサポートされていない句が1つだけ存在するという例外があるため、このケースをカバーするために EWI が実装されました。

関連 EWIs

  • SSC-EWI-RS0003: スキーマバインドステートメントがない場合、Snowflakeではサポートされません。

DELETE

説明

テーブルから行を削除します。(Redshift SQL 言語リファレンスDeleteステートメント)。

この構文は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

アリス

販売

2

2

ボブ

販売

1

3

チャーリー

販売

1

7

グレース

エンジニアリング

6

8

ヘレン

エンジニアリング

7

9

アイビー

エンジニアリング

7

10

John

販売

3

11

ジョー

エンジニアリング

5

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

SELECT * FROM
    employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

アリス

販売

2

2

ボブ

販売

1

3

チャーリー

販売

1

7

グレース

エンジニアリング

6

8

ヘレン

エンジニアリング

7

9

アイビー

エンジニアリング

7

10

John

販売

3

11

ジョー

エンジニアリング

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

デイビッド

マーケティング

2

5

イブ

マーケティング

4

6

フランク

マーケティング

4

7

グレース

エンジニアリング

6

8

ヘレン

エンジニアリング

7

9

アイビー

エンジニアリング

7

11

ジョー

エンジニアリング

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

デイビッド

マーケティング

2

5

イブ

マーケティング

4

6

フランク

マーケティング

4

7

グレース

エンジニアリング

6

8

ヘレン

エンジニアリング

7

9

アイビー

エンジニアリング

7

11

ジョー

エンジニアリング

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

デイビッド

マーケティング

2

5

イブ

マーケティング

4

6

フランク

マーケティング

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

デイビッド

マーケティング

2

5

イブ

マーケティング

4

6

フランク

マーケティング

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

アリス

販売

2

2

ボブ

販売

1

3

チャーリー

販売

1

10

John

販売

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

アリス

販売

2

2

ボブ

販売

1

3

チャーリー

販売

1

10

John

販売

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 言語リファレンス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

グレース・リー

32000

操作

2

ハンナ・グレイ

26000

ファイナンス

出力コード:
 INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM
    new_employees;
Copy

ID

NAME

SALARY

DEPARTMENT

1

グレース・リー

32000

操作

2

ハンナ・グレイ

26000

ファイナンス

既知の問題

  • Snowflakeの VALUES 句で使用できない式があります。例えば、Redshiftの場合、 VALUES 句内で JSON_PARSE関数を使用すると、 SUPER データ型に JSON 値を挿入することができます。ただし、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

Snowflakeでは REMOVE DUPLICATES 句はサポートされていませんが、元の動作をエミュレートする回避策があります。

出力コードには3つの新しいステートメントが追加されます。

  • 条件に一致するソーステーブルとターゲットテーブルの重複値を持つ 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

デイジー

22

クラレンス

30

トニー

11

アリス

23

デイビッド

出力コード:
 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

クラレンス

30

トニー

30

デイジー

11

アリス

23

デイビッド

既知の問題

既知の問題はありません。

関連 EWIs

  1. SSC-EWI-RS0009: ソーステーブルの意味情報が見つかりません。

  2. SSC-FDM-RS0005: ソーステーブルで重複が許可されていません。

UPDATE

説明

条件が満たされたときに、1つ以上のテーブル列の値を更新します。(Redshift SQL 言語リファレンス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

アリス

505000

HR

2

ボブ

600000

エンジニアリング

3

チャーリー

700000

エンジニアリング

4

デイビッド

405000

マーケティング

5

イブ

455000

HR

6

フランク

750000

エンジニアリング

7

グレース

650000

エンジニアリング

8

ヘレン

395000

マーケティング

9

アイビー

485000

HR

10

ジャック

425000

エンジニアリング

11

ケン

700000

マーケティング

12

リアム

600000

エンジニアリング

13

モナ

475000

HR

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

ID

NAME

SALARY

DEPARTMENT

1

アリス

505000

HR

2

ボブ

600000

エンジニアリング

3

チャーリー

700000

エンジニアリング

4

デイビッド

405000

マーケティング

5

イブ

455000

HR

6

フランク

750000

エンジニアリング

7

グレース

650000

エンジニアリング

8

ヘレン

395000

マーケティング

9

アイビー

485000

HR

10

ジャック

425000

エンジニアリング

11

ケン

700000

マーケティング

12

リアム

600000

エンジニアリング

13

モナ

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

アリス

500000

HR

2

ボブ

600000

エンジニアリング

3

チャーリー

700000

エンジニアリング

4

デイビッド

546923

マーケティング

5

イブ

546923

HR

6

フランク

750000

エンジニアリング

7

グレース

650000

エンジニアリング

8

ヘレン

546923

マーケティング

9

アイビー

546923

HR

10

ジャック

546923

エンジニアリング

11

ケン

700000

マーケティング

12

リアム

600000

エンジニアリング

13

モナ

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

アリス

500000

HR

2

ボブ

600000

エンジニアリング

3

チャーリー

700000

エンジニアリング

4

デイビッド

546923

マーケティング

5

イブ

546923

HR

6

フランク

750000

エンジニアリング

7

グレース

650000

エンジニアリング

8

ヘレン

546923

マーケティング

9

アイビー

546923

HR

10

ジャック

546923

エンジニアリング

11

ケン

700000

マーケティング

12

リアム

600000

エンジニアリング

13

モナ

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

アリス

526666

HR

2

ボブ

670000

エンジニアリング

3

チャーリー

773333

エンジニアリング

4

デイビッド

433333

マーケティング

5

イブ

475000

HR

6

フランク

825000

エンジニアリング

7

グレース

721666

エンジニアリング

8

ヘレン

423000

マーケティング

9

アイビー

506000

HR

10

ジャック

484000

エンジニアリング

11

ケン

743333

マーケティング

12

リアム

670000

エンジニアリング

13

モナ

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

アリス

526667

HR

2

ボブ

670000

エンジニアリング

3

チャーリー

773333

エンジニアリング

4

デイビッド

433333

マーケティング

5

イブ

475000

HR

6

フランク

825000

エンジニアリング

7

グレース

721667

エンジニアリング

8

ヘレン

423000

マーケティング

9

アイビー

506000

HR

10

ジャック

484000

エンジニアリング

11

ケン

743333

マーケティング

12

リアム

670000

エンジニアリング

13

モナ

495667

HR

SET DEFAULT 値

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

ID

NAME

SALARY

DEPARTMENT

1

アリス

20000

販売

2

ボブ

600000

エンジニアリング

3

チャーリー

700000

エンジニアリング

4

デイビッド

400000

マーケティング

5

イブ

20000

販売

6

フランク

750000

エンジニアリング

7

グレース

650000

エンジニアリング

8

ヘレン

390000

マーケティング

9

アイビー

20000

販売

10

ジャック

420000

エンジニアリング

11

ケン

700000

マーケティング

12

リアム

600000

エンジニアリング

13

モナ

20000

販売

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

ID

NAME

SALARY

DEPARTMENT

1

アリス

20000

販売

2

ボブ

600000

エンジニアリング

3

チャーリー

700000

エンジニアリング

4

デイビッド

400000

マーケティング

5

イブ

20000

販売

6

フランク

750000

エンジニアリング

7

グレース

650000

エンジニアリング

8

ヘレン

390000

マーケティング

9

アイビー

20000

販売

10

ジャック

420000

エンジニアリング

11

ケン

700000

マーケティング

12

リアム

600000

エンジニアリング

13

モナ

20000

販売

SET 句

列の値を変更する役割を担っています。Snowflakeと同様に、構成パラメーター ERROR_ON_NONDETERMINISTIC_UPDATE がtrueにセットされている場合、1行に複数のマッチがある更新クエリはエラーをスローします。このフラグはSnowflakeでも同じように動作し、 ERROR_ON_NONDETERMINISTIC_UPDATE という同じ名前を使っています。

しかし、このフラグをオフにするとエラーは返されず、マッチした行の1つがターゲット行の更新に使用されます。選択された結合行は、どちらの言語でも非決定的かつ任意です。実行間で動作が一貫していない可能性があり、データの不整合が発生する可能性があります。

セットアップデータ:
 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の SORTKEYCLUSTER BY に移行することができます。Snowflakeの CLUSTER BY は、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のパフォーマンスと比較して異なる場合があります。