SnowConvert AI - Redshift - SQL Statements¶
Translation reference for all the supported statements by SnowConvert AI for Redshift.
CALL¶
説明¶
ストアドプロシージャを実行します。CALL コマンドには、プロシージャ名と入力引数の値を含める必要があります。ストアドプロシージャを呼び出すには、 CALL ステートメントを使用する必要があります。(Redshift SQL 言語リファレンス CALL)。
文法構文¶
CALL sp_name ( [ argument ] [, ...] )
サンプルソースパターン¶
基本シナリオ¶
入力コード:¶
Redshift¶
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);
出力コード:¶
Redshift¶
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": "07/11/2025", "domain": "no-domain-provided" }}'
AS
$$
BEGIN
INSERT INTO event
VALUES (:arg1, : arg2);
END;
$$;
CALL sp_insert_values(1, CURRENT_DATE());
出力パラメーターモードを使用した呼び出し(INOUT、 OUT)¶
入力コード:¶
Redshift¶
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();
出力コード:¶
Redshift¶
CREATE OR REPLACE PROCEDURE sp_calculate_sum_product (a NUMERIC, b NUMERIC, sum_result OUT NUMERIC, product_result OUT NUMERIC)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
BEGIN
sum_result := a + b;
product_result := a * b;
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": "07/11/2025", "domain": "no-domain-provided" }}'
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();
既知の問題¶
Output parameters from calls outside procedures won't work.
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>' } }
詳細情報については、Redshift CREATE DATABASE
ドキュメント をご参照ください。
サンプルソースパターン¶
基本サンプル¶
入力コード:¶
Redshift¶
CREATE DATABASE database_name;
出力コード:¶
Snowflake¶
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" }}';
Collate句¶
入力コード:¶
Redshift¶
CREATE DATABASE database_collate
COLLATE CASE_INSENSITIVE;
出力コード:¶
Snowflake¶
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" }}';
Connection Limit句¶
入力コード:¶
Redshift¶
CREATE DATABASE database_connection
CONNECTION LIMIT UNLIMITED;
出力コード:¶
Snowflake¶
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" }}';
警告
Snowflakeの接続同時性はウェアハウスによって管理されるため、connection limit句は削除されます。詳細は こちら。
From ARN 句¶
入力コード:¶
Redshift¶
CREATE DATABASE database_fromARN
FROM ARN 'arn' WITH NO DATA CATALOG SCHEMA IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name';
出力コード:¶
Snowflake¶
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" }}';
警告
この句は Amazon Resources の参照に使用されており、Snowflakeでは無効であるため削除しました。
Owner句¶
入力コード¶
Redshift¶
CREATE DATABASE database_Owner
OWNER db_owner
ENCODING 'encoding';
出力コード¶
Snowflake¶
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" }}';
警告
この場合、Snowflakeデータベースは個々のユーザーではなくロールによって所有されるため、owner句はコードから削除されることに注意してください。詳細情報については、 Snowflake GRANT OWNERSHIP
ドキュメント を参照してください。
Isolation Level句¶
入力コード¶
Redshift¶
CREATE DATABASE database_Isolation
ISOLATION LEVEL SNAPSHOT;
出力コード¶
Snowflake¶
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" }}';
注釈
Isolation Levelの変換は、今後提供される予定です。
関連 EWIs¶
SSC-EWI-0073: 機能同等性レビュー保留中
CREATE EXTERNAL TABLE¶
説明¶
Currently SnowConvert AI is transforming CREATE EXTERNAL TABLES
to regular tables, that implies additional effort because data stored in external RedShift tables must be transferred to the Snowflake database.
文法構文¶
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 }
こちらをクリックすると、この構文の仕様にジャンプします。
サンプルソースパターン¶
入力コード:¶
Redshift¶
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/';
出力コード:¶
Snowflake¶
--** 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" }}'
;
外部テーブル作成 AS¶
入力コード:¶
Redshift¶
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;
出力コード:¶
Snowflake¶
--** 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;
推奨事項¶
Snowflakeでの外部テーブル作成の使用方法については、 Snowflakeのドキュメントを参照してください。
関連 EWIs¶
SSC-FDM-0004: 外部テーブルを通常のテーブルに翻訳する
CREATE MATERIALIZED VIEW¶
説明¶
In SnowConvert AI, Redshift Materialized Views are transformed into Snowflake Dynamic Tables. To properly configure Dynamic Tables, two essential parameters must be defined: TARGET_LAG and WAREHOUSE. If these parameters are left unspecified in the configuration options, SnowConvert AI will default to preassigned values during the conversion, as demonstrated in the example below.
マテリアライズドビューの詳細情報については、 こちら をクリックしてください。
動的テーブルに必要なパラメーターについては、 こちら をご覧ください。
文法構文¶
以下は、Amazon Redshiftでビューを作成するための SQL 構文です。この構文に関するRedshiftsの仕様については、 こちら をクリックしてください。
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
サンプルソースパターン¶
入力コード:¶
Redshift¶
CREATE MATERIALIZED VIEW mv_baseball AS
SELECT ball AS baseball FROM baseball_table;
出力コード:¶
Snowflake¶
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;
警告
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 [ ... ] ]
詳細情報については、 Redshift CREATE SCHEMA
ドキュメント をご参照ください。
サンプルソースパターン¶
基本サンプル¶
入力コード:¶
Redshift¶
CREATE SCHEMA s1;
CREATE SCHEMA IF NOT EXISTS s2;
CREATE SCHEMA s3
CREATE TABLE t1
(
col1 INT
)
CREATE VIEW v1 AS SELECT * FROM t1;
出力コード:¶
Snowflake¶
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;
Quota句¶
入力コード:¶
Redshift¶
CREATE SCHEMA s1 QUOTA UNLIMITED;
CREATE SCHEMA s2 QUOTA 10 TB;
出力コード:¶
Snowflake¶
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" }}'
;
注釈
Snowflakeでは、スキームごとにクォータを定義することはできません。ストレージ管理はアカウントとウェアハウスレベルで行われ、Snowflakeが自動的に処理します。そのため、コードからは削除されています。
関連 EWIs¶
既知の問題はありません。
CREATE FUNCTION¶
説明¶
This command defines a user-defined function (UDF) within the database. These functions encapsulate reusable logic that can be invoked within SQL queries.
文法構文¶
以下は、Amazon Redshiftでビューを作成するための SQL 構文です。こちらをクリックして、この構文のRedshifts仕様にアクセスしてください。
CREATE [ OR REPLACE ] FUNCTION f_function_name
( { [py_arg_name py_arg_data_type |
sql_arg_data_type } [ , ... ] ] )
RETURNS data_type
{ VOLATILE | STABLE | IMMUTABLE }
AS $$
{ python_program | SELECT_clause }
$$ LANGUAGE { plpythonu | sql }
SQL Language¶
Volatility category¶
In Snowflake, VOLATILE
and IMMUTABLE
function volatility are functionally equivalent. Given that STABLE
is inherently transformed to the default VOLATILE
behavior, explicit use of STABLE
will be delete.
入力コード:¶
Redshift¶
CREATE OR REPLACE FUNCTION get_sale(INTEGER)
RETURNS FLOAT
STABLE
AS $$
SELECT price FROM sales where id = $1
$$ LANGUAGE SQL;
出力コード:¶
Snowflake¶
CREATE OR REPLACE FUNCTION get_sale (SC_ARG1 INTEGER)
RETURNS FLOAT
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
SELECT price FROM
sales
where id = SC_ARG1
$$
;
Python Language¶
Within the SnowConvert AI scope, the Python language for CREATE FUNCTION
statements is not supported. Consequently, the language plpythonu
will be flagged with an EWI (SSC-EWI-0073), and its body could appear with parsing errors.
入力コード:¶
Redshift¶
create function f_py_greater (a float, b float)
returns float
stable
as $$
if a > b:
return a
return b
$$ language plpythonu;
出力コード:¶
Snowflake¶
create function f_py_greater (a float, b float)
returns float
language plpythonu !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'LANGUAGE PLPythonU' NODE ***/!!!
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
as $$
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '5' COLUMN '3' OF THE SOURCE CODE STARTING AT 'if'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'if' ON LINE '5' COLUMN '3'. **
-- if a > b:
-- return a
-- return b
$$
;
関連 EWIs¶
既知の問題はありません。
CREATE VIEW¶
説明¶
このコマンドはデータベースにビューを作成し、そのビューがクエリで参照される度に実行されます。WITH NO SCHEMA BINDING 句を使用すると、まだ存在しない外部テーブルやオブジェクトに対するビューを作成できます。ただしこの句では、参照するオブジェクトやテーブルの修飾名を指定する必要があります。
文法構文¶
以下は、Amazon Redshiftでビューを作成するための SQL 構文です。こちらをクリックして、この構文のRedshifts仕様にアクセスしてください。
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
サンプルソースパターン¶
Redshiftsコマンドの必須句とオプション句を考慮すると、Snowflakeへの移行後の出力は非常に似ています。
入力コード:¶
Redshift¶
CREATE VIEW myuser
AS
SELECT lastname FROM users;
CREATE VIEW myuser2
AS
SELECT lastname FROM users2
WITH NO SCHEMA BINDING;
出力コード:¶
Snowflake¶
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;
ただし、Redshiftでサポートされていない句が1つだけ存在するという例外があるため、このケースをカバーするために EWI が実装されました。
関連 EWIs¶
SSC-EWI-RS0003: スキーマバインドステートメントがない場合、Snowflakeではサポートされません。
DELETE¶
説明¶
テーブルから行を削除します。(Redshift SQL 言語リファレンスDeleteステートメント)。
Note
この構文はSnowflakeで完全にサポートされています。
文法構文¶
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
[ USING table_name, ... ]
[ WHERE condition ]
サンプルソースパターン¶
Setup data¶
Redshift¶
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');
From句¶
他のテーブルの情報を参照してテーブルを更新します。Redshiftでは FROM キーワードはオプションですが、Snowflakeでは必須です。そのため、欠けている場合は追加されます。
入力コード:¶
Redshift¶
DELETE employees;
SELECT * FROM employees ORDER BY id;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
出力コード:¶
Snowflake¶
DELETE FROM
employees;
SELECT * FROM employees ORDER BY id;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
Where句¶
条件に一致する行の更新を制限します。条件がtrueを返すと、指定した SET 列が更新されます。条件は列に対する単純な述語か、サブクエリの結果に基づく条件です。この句はSnowflakeでは完全に等価です。
入力コード:¶
Redshift¶
DELETE FROM employees
WHERE department = 'Marketing';
SELECT * FROM employees
ORDER BY id;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
1 |
アリス |
販売 |
2 |
2 |
ボブ |
販売 |
1 |
3 |
チャーリー |
販売 |
1 |
7 |
グレース |
エンジニアリング |
6 |
8 |
ヘレン |
エンジニアリング |
7 |
9 |
アイビー |
エンジニアリング |
7 |
10 |
John |
販売 |
3 |
11 |
ジョー |
エンジニアリング |
5 |
出力コード:¶
Snowflake¶
DELETE FROM
employees
WHERE department = 'Marketing';
SELECT * FROM
employees
ORDER BY id;
Result¶
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では完全に等価です。
入力コード:¶
Redshift¶
DELETE FROM employees
USING departments d
WHERE employees.department = d.department_name
AND d.department_name = 'Sales';
SELECT * FROM employees ORDER BY id;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
4 |
デイビッド |
マーケティング |
2 |
5 |
イブ |
マーケティング |
4 |
6 |
フランク |
マーケティング |
4 |
7 |
グレース |
エンジニアリング |
6 |
8 |
ヘレン |
エンジニアリング |
7 |
9 |
アイビー |
エンジニアリング |
7 |
11 |
ジョー |
エンジニアリング |
5 |
出力コード:¶
Snowflake¶
DELETE FROM employees
USING departments d
WHERE employees.department = d.department_name
AND d.department_name = 'Sales';
SELECT * FROM employees ORDER BY id;
Result¶
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¶
入力コード:¶
Redshift¶
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;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
4 |
デイビッド |
マーケティング |
2 |
5 |
イブ |
マーケティング |
4 |
6 |
フランク |
マーケティング |
4 |
出力コード:¶
Snowflake¶
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;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
4 |
デイビッド |
マーケティング |
2 |
5 |
イブ |
マーケティング |
4 |
6 |
フランク |
マーケティング |
4 |
再帰型 CTE¶
入力コード:¶
Redshift¶
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);
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
1 |
アリス |
販売 |
2 |
2 |
ボブ |
販売 |
1 |
3 |
チャーリー |
販売 |
1 |
10 |
John |
販売 |
3 |
出力コード:¶
Snowflake¶
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;
Result¶
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
1 |
アリス |
販売 |
2 |
2 |
ボブ |
販売 |
1 |
3 |
チャーリー |
販売 |
1 |
10 |
John |
販売 |
3 |
マテリアライズドビューの削除¶
Redshiftでは、 ストリーミング取り込み に使用するマテリアライズドビューに DELETE ステートメントを適用することができます。Snowflakeでは、これらのビューは動的テーブルに変換され、動的テーブルでは DELETE ステートメントは使用できません。このため、 EWI が追加されます。
入力コード:¶
Redshift¶
CREATE MATERIALIZED VIEW emp_mv AS
SELECT id, name, department FROM employees WHERE department = 'Engineering';
DELETE FROM emp_mv
WHERE id = 2;
出力コード:¶
Snowflake¶
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;
既知の問題¶
WITH
句の機能を複製するには、各共通テーブル式(CTE)をミラーリングした仮テーブルを作成する必要があります。しかし、現在のセッション内に同じ名前の仮テーブルがすでに存在する場合、この方法はエラーになります。
関連 EWIs¶
SSC-FDM-0031: デフォルトで設定されている動的テーブルの必須パラメーター。
SSC-EWI-RS0008: Deleteステートメントは動的テーブルでは使用できません。
EXECUTE¶
説明¶
The
EXECUTE
IMMEDIATE
statement builds and runs a dynamic SQL statement in a single operation.Native dynamic SQL uses the
EXECUTE
IMMEDIATE
statement to process most dynamic SQL statements. (Redshift Language Reference EXECUTE Statement)
文法構文¶
EXECUTE command-string [ INTO target ];
サンプルソースパターン¶
Concated Example
入力コード
Redshift¶
CREATE OR REPLACE PROCEDURE create_dynamic_table(table_name VARCHAR)
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'CREATE TABLE IF NOT EXISTS ' || table_name || ' (id INT, value VARCHAR);';
EXECUTE sql_statement;
END;
$$ LANGUAGE plpgsql;
出力コード
Snowflake¶
CREATE OR REPLACE PROCEDURE create_dynamic_table (table_name VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'CREATE TABLE IF NOT EXISTS ' || table_name || ' (id INT, value VARCHAR)';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE sql_statement;
END;
$$;
Function Transformation¶
入力コード¶
Redshift¶
CREATE OR REPLACE PROCEDURE insert_with_dynamic()
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'insert into orders(order_date) values ("getdate"());';
EXECUTE sql_statement;
END;
$$ LANGUAGE plpgsql;
出力コード¶
Snowflake¶
CREATE OR REPLACE PROCEDURE insert_with_dynamic ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'insert into orders (order_date) values (GETDATE())';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE sql_statement;
END;
$$;
Error In Query Parsing¶
入力コード¶
Redshift¶
CREATE OR REPLACE PROCEDURE bad_statement(table_name VARCHAR)
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'bad statement goes here';
EXECUTE sql_statement;
END;
$$ LANGUAGE plpgsql;
出力コード¶
Snowflake¶
CREATE OR REPLACE PROCEDURE bad_statement (table_name VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'bad statement goes here';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!
EXECUTE IMMEDIATE sql_statement;
END;
$$;
INTO Clause¶
入力コード¶
Redshift¶
CREATE OR REPLACE PROCEDURE get_max_id(table_name VARCHAR, OUT max_id INTEGER)
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'SELECT MAX(id) FROM ' || table_name || ';';
EXECUTE sql_statement INTO max_id;
END;
$$ LANGUAGE plpgsql;
出力コード¶
Snowflake¶
CREATE OR REPLACE PROCEDURE get_max_id (table_name VARCHAR, max_id OUT INTEGER)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "07/11/2025", "domain": "no-domain-provided" }}'
AS $$
DECLARE
sql_statement VARCHAR;
BEGIN
sql_statement := 'SELECT
MAX(id) FROM
' || table_name;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE sql_statement
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0007 - INTO CLAUSE IN DYNAMIC SQL IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! INTO max_id;
END;
$$;
既知の問題¶
1. Execution results cannot be stored in variables.¶
SnowScripting does not support INTO nor BULK COLLECT INTO clauses. For this reason, results will need to be passed through other means.
2. Dynamic SQL Execution queries may be marked incorrectly as non-runnable.¶
In some scenarios there an execute statement may be commented regardless of being safe or non-safe to run so please take this into account:
関連 EWIs¶
SSC-EWI-0027: Variable with invalid query.
SSC-EWI-0030: The statement below has usages of dynamic SQL.
INSERT¶
説明¶
テーブルに新しい行を挿入します。(Redshift SQL 言語リファレンスInsertステートメント)。
警告
この構文はSnowflakeで部分的にサポートされています。
文法構文¶
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
サンプルソースパターン¶
Setup data¶
Redshift¶
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');
デフォルト値¶
デフォルト値で完全な行を挿入します。デフォルト値を持たない列がある場合、それらの列には NULL の値が挿入されます。
This clause cannot specify individual columns; it always inserts a complete row with its default values. Additionally, columns with the NOT NULL constraint cannot be included in the table definition. To replicate this behavior in Snowflake, SnowConvert AI insert a column with a DEFAULT value in the table. This action inserts a complete row, using the default value for every column.
入力コード:¶
Redshift¶
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;
Result¶
ID |
NAME |
SALARY |
DEPARTMENT |
---|---|---|---|
1 |
NULL |
20000 |
マーケティング |
出力コード:¶
Snowflake¶
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;
Result¶
ID |
NAME |
SALARY |
DEPARTMENT |
---|---|---|---|
1 |
NULL |
20000 |
マーケティング |
クエリ¶
クエリを使用して、テーブルに1行または複数行を挿入します。クエリによって生成された行はすべてテーブルに挿入されます。クエリは、テーブルの列と互換性のある列リストを返さなければなりませんが、列名が一致する必要はありません。この機能はSnowflakeでは完全に等価です。
入力コード:¶
Redshift¶
INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM new_employees;
Result¶
ID |
NAME |
SALARY |
DEPARTMENT |
---|---|---|---|
1 |
グレース・リー |
32000 |
操作 |
2 |
ハンナ・グレイ |
26000 |
ファイナンス |
出力コード:¶
Snowflake¶
INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM
new_employees;
Result¶
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 ]
詳細情報については、Redshift MERGE ドキュメント を参照してください。
サンプルソースパターン¶
UPDATE - INSERT¶
両言語に違いはありません。コードはオリジナルのままです。
入力コード:¶
Redshift¶
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);
出力コード:¶
Snowflake¶
--** 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);
DELETE - INSERT¶
両言語に違いはありません。コードはオリジナルのままです。
入力コード:¶
Redshift¶
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
出力コード:¶
Snowflake¶
--** 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);
REMOVE DUPLICATES¶
Snowflakeでは REMOVE DUPLICATES 句はサポートされていませんが、元の動作をエミュレートする回避策があります。
出力コードには3つの新しいステートメントが追加されます。
条件に一致するソーステーブルとターゲットテーブルの重複値を持つ TEMPORARY TABLE
マージ後に保留中の値をターゲットテーブルに追加する INSERT ステートメント
生成された仮テーブルをドロップする DROP ステートメント。
DROP DUPLICATES の動作では、ターゲットテーブルから重複値を削除し、ソーステーブルから条件に一致する値を挿入するため、これらは必要です。
入力コード:¶
Redshift¶
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;
Results¶
ID |
NAME |
---|---|
30 |
デイジー |
22 |
クラレンス |
30 |
トニー |
11 |
アリス |
23 |
デイビッド |
出力コード:¶
Snowflake¶
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;
Results¶
ID |
NAME |
---|---|
22 |
クラレンス |
30 |
トニー |
30 |
デイジー |
11 |
アリス |
23 |
デイビッド |
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-EWI-RS0009: ソーステーブルの意味情報が見つかりません。
SSC-FDM-RS0005: ソーステーブルで重複が許可されていません。
UPDATE¶
説明¶
条件が満たされたときに、1つ以上のテーブル列の値を更新します。(Redshift SQL 言語リファレンスUpdateステートメント)。
Note
この構文はSnowflakeで完全にサポートされています。
文法構文¶
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]
[ FROM fromlist ]
[ WHERE condition ]
サンプルソースパターン¶
Setup data¶
Redshift¶
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);
エイリアス¶
Snowflakeの文法ではテーブルエイリアスの使用は指定されていませんが、Snowflakeでは有効なコードです。
入力コード:¶
Redshift¶
UPDATE employees AS e
SET salary = salary + 5000
WHERE e.salary < 600000;
Result¶
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 |
出力コード:¶
Snowflake¶
UPDATE employees AS e
SET salary = salary + 5000
WHERE e.salary < 600000;
Result¶
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 句¶
この句は、1つ以上の共通テーブル式(CTE)を指定します。出力列名は非再帰型 CTEs ではオプションですが、再帰型では必須です。
この句は UPDATE ステートメントでは使用できないため、対応するクエリを持つ仮テーブルに変換されます。UPDATE ステートメント実行後、これらの仮テーブルはクリーンアップ、リソースのリリース、同じセッション内でテーブルを作成する際の名前の衝突を避けるためにドロップされます。さらに、仮テーブルは同じセッション内の同じ名前の他のテーブルよりも 優先される ため、同じ名前の通常のテーブルが存在する場合は、そちらが再び優先されます。
非再帰型 CTE¶
入力コード:¶
Redshift¶
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;
Result¶
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 |
出力コード:¶
Snowflake¶
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;
Result¶
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 |
再帰型 CTE¶
入力コード:¶
Redshift¶
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;
Result¶
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 |
出力コード:¶
Snowflake¶
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;
Result¶
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 値¶
入力コード:¶
Redshift¶
UPDATE employees
SET salary = DEFAULT, department = 'Sales'
WHERE department = 'HR';
Result¶
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 |
販売 |
出力コード:¶
Snowflake¶
UPDATE employees
SET salary = DEFAULT, department = 'Sales'
WHERE
department = 'HR';
Result¶
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つがターゲット行の更新に使用されます。選択された結合行は、どちらの言語でも非決定的かつ任意です。実行間で動作が一貫していない可能性があり、データの不整合が発生する可能性があります。
セットアップデータ:¶
Redshift¶
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);
入力コード:¶
Redshift¶
UPDATE target
SET v = src.v
FROM src
WHERE target.k = src.k;
SELECT * FROM target;
Result¶
K |
V |
---|---|
0 |
16 |
出力コード:¶
Snowflake¶
UPDATE target
SET v = src.v
FROM src
WHERE target.k = src.k;
SELECT * FROM target;
Result¶
K |
V |
---|---|
0 |
14 |
既知の問題¶
行に複数のマッチを持つ更新クエリは、データの不整合を引き起こす可能性があります。両プラットフォームともフラグ ERROR_ON_NONDETERMINISTIC_UPDATE を持っていますが、これらの値は常に非決定的です。Snowflakeは、これらのシナリオに対処するための推奨事項を提供しています。詳細は こちら をご覧ください。
WITH
句の機能を複製するには、各共通テーブル式(CTE)をミラーリングした仮テーブルを作成する必要があります。しかし、現在のセッション内に同じ名前の仮テーブルがすでに存在する場合、この方法はエラーになります。
関連 EWIs¶
既知の問題はありません。