SnowConvert: Redshift SQL ステートメント¶
CALL¶
説明¶
ストアドプロシージャを実行します。CALL コマンドには、プロシージャ名と入力引数の値を含める必要があります。ストアドプロシージャを呼び出すには、 CALL ステートメントを使用する必要があります。(Redshift SQL 言語リファレンス CALL)。
警告
この構文はSnowflakeで部分的にサポートされています。出力パラメーターを使用するプロシージャ呼び出しには、 SSC-EWI-0073 のタグが付けられます。この変換は将来的に実現されるでしょう。
文法構文¶
CALL sp_name ( [ argument ] [, ...] )
サンプルソースパターン¶
基本シナリオ¶
入力コード:¶
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);
出力コード:¶
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());
出力パラメーターモードを使用した呼び出し(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();
出力コード:¶
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();
既知の問題¶
出力パラメーターは現在、プロシージャ呼び出しではサポートされていません。
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
ドキュメント をご参照ください。
サンプルソースパターン¶
基本サンプル¶
入力コード:¶
CREATE DATABASE database_name;
出力コード:¶
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句¶
入力コード:¶
CREATE DATABASE database_collate
COLLATE CASE_INSENSITIVE;
出力コード:¶
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句¶
入力コード:¶
CREATE DATABASE database_connection
CONNECTION LIMIT UNLIMITED;
出力コード:¶
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 句¶
入力コード:¶
CREATE DATABASE database_fromARN
FROM ARN 'arn' WITH NO DATA CATALOG SCHEMA IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name';
出力コード:¶
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句¶
入力コード¶
CREATE DATABASE database_Owner
OWNER db_owner
ENCODING 'encoding';
出力コード¶
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句¶
入力コード¶
CREATE DATABASE database_Isolation
ISOLATION LEVEL SNAPSHOT;
出力コード¶
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¶
説明¶
現在、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 }
こちらをクリックすると、この構文の仕様にジャンプします。
サンプルソースパターン¶
入力コード:¶
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/';
出力コード:¶
--** 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¶
入力コード:¶
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;
出力コード:¶
--** 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¶
説明¶
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
サンプルソースパターン¶
入力コード:¶
CREATE MATERIALIZED VIEW mv_baseball AS
SELECT ball AS baseball FROM baseball_table;
出力コード:¶
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
ドキュメント をご参照ください。
サンプルソースパターン¶
基本サンプル¶
入力コード:¶
CREATE SCHEMA s1;
CREATE SCHEMA IF NOT EXISTS s2;
CREATE SCHEMA s3
CREATE TABLE t1
(
col1 INT
)
CREATE VIEW v1 AS SELECT * FROM t1;
出力コード:¶
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句¶
入力コード:¶
CREATE SCHEMA s1 QUOTA UNLIMITED;
CREATE SCHEMA s2 QUOTA 10 TB;
出力コード:¶
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 VIEW¶
説明¶
このコマンドはデータベースにビューを作成し、そのビューがクエリで参照される度に実行されます。WITH NO SCHEMA BINDING 句を使用すると、まだ存在しない外部テーブルやオブジェクトに対するビューを作成できます。ただしこの句では、参照するオブジェクトやテーブルの修飾名を指定する必要があります。
文法構文¶
以下は、Amazon Redshiftでビューを作成するための SQL 構文です。こちらをクリックして、この構文のRedshifts仕様にアクセスしてください。
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
サンプルソースパターン¶
Redshiftsコマンドの必須句とオプション句を考慮すると、Snowflakeへの移行後の出力は非常に似ています。
入力コード:¶
CREATE VIEW myuser
AS
SELECT lastname FROM users;
CREATE VIEW myuser2
AS
SELECT lastname FROM users2
WITH NO SCHEMA BINDING;
出力コード:¶
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ステートメント)。
この構文はSnowflakeで完全にサポートされています。
Grammar Syntax
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
[ USING table_name, ... ]
[ WHERE condition ]
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');
From句
他のテーブルの情報を参照してテーブルを更新します。Redshiftでは FROM キーワードはオプションですが、Snowflakeでは必須です。そのため、欠けている場合は追加されます。
Input Code:
DELETE employees;
SELECT * FROM employees ORDER BY id;
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
Output Code:
DELETE FROM
employees;
SELECT * FROM employees ORDER BY id;
ID |
NAME |
DEPARTMENT |
MANAGER_ID |
---|---|---|---|
Where句
条件に一致する行の更新を制限します。条件がtrueを返すと、指定した SET 列が更新されます。条件は列に対する単純な述語か、サブクエリの結果に基づく条件です。この句はSnowflakeでは完全に等価です。
Input Code:
DELETE FROM employees
WHERE department = 'Marketing';
SELECT * FROM employees
ORDER BY id;
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;
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;
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;
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;
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;
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);
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;
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;
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;
Known Issues
WITH
句の機能を複製するには、各共通テーブル式(CTE)をミラーリングした仮テーブルを作成する必要があります。しかし、現在のセッション内に同じ名前の仮テーブルがすでに存在する場合、この方法はエラーになります。
Related EWIs
SSC-FDM-0031: デフォルトで設定されている動的テーブルの必須パラメーター。
SSC-EWI-RS0008: Deleteステートメントは動的テーブルでは使用できません。
INSERT
Description
テーブルに新しい行を挿入します。(Redshift SQL 言語リファレンスInsertステートメント)。
警告
この構文はSnowflakeで部分的にサポートされています。
文法構文¶
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
サンプルソースパターン¶
セットアップデータ¶
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 の値が挿入されます。
この句は個々の列を指定することはできません。常にデフォルト値で完全な行を挿入します。また、 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;
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;
ID |
NAME |
SALARY |
DEPARTMENT |
---|---|---|---|
1 |
NULL |
20000 |
マーケティング |
クエリ¶
クエリを使用して、テーブルに1行または複数行を挿入します。クエリによって生成された行はすべてテーブルに挿入されます。クエリは、テーブルの列と互換性のある列リストを返さなければなりませんが、列名が一致する必要はありません。この機能はSnowflakeでは完全に等価です。
入力コード:¶
INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM new_employees;
ID |
NAME |
SALARY |
DEPARTMENT |
---|---|---|---|
1 |
グレース・リー |
32000 |
操作 |
2 |
ハンナ・グレイ |
26000 |
ファイナンス |
出力コード:¶
INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM
new_employees;
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¶
両言語に違いはありません。コードはオリジナルのままです。
入力コード:¶
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);
出力コード:¶
--** 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¶
両言語に違いはありません。コードはオリジナルのままです。
入力コード:¶
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
出力コード:¶
--** 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 の動作では、ターゲットテーブルから重複値を削除し、ソーステーブルから条件に一致する値を挿入するため、これらは必要です。
入力コード:¶
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;
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;
ID |
NAME |
---|---|
22 |
クラレンス |
30 |
トニー |
30 |
デイジー |
11 |
アリス |
23 |
デイビッド |
既知の問題¶
既知の問題はありません。
関連 EWIs¶
SSC-EWI-RS0009: ソーステーブルの意味情報が見つかりません。
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 ]
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);
エイリアス
Snowflakeの文法ではテーブルエイリアスの使用は指定されていませんが、Snowflakeでは有効なコードです。
Input Code:
UPDATE employees AS e
SET salary = salary + 5000
WHERE e.salary < 600000;
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;
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;
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;
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;
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;
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';
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';
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);
Input Code:
UPDATE target
SET v = src.v
FROM src
WHERE target.k = src.k;
SELECT * FROM target;
K |
V |
---|---|
0 |
16 |
Output Code:
UPDATE target
SET v = src.v
FROM src
WHERE target.k = src.k;
SELECT * FROM target;
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 [, ...] ) ]
テーブルスタート: BACKUP
Description
Amazon Redshiftがクエリパフォーマンスを最適化するために、テーブル内のすべての列のエンコードタイプを自動的に調整できるようにします。Snowflakeでは、他のデータベースで見られるような BACKUP
の概念は直接適用されません。Snowflakeは、Time TravelやFail-safeなどの組み込み機能により、データのバックアップとリカバリーを自動的に処理し、手動でのバックアップ操作を不要にします。これらの理由から、ステートメント BACKUP
は変換処理中に削除されます
この構文に関するAmazon Redshiftのドキュメントページに移動するには、 ここ をクリックしてください。
Grammar Syntax
BACKUP { YES | NO }
Sample Source Patterns
NOオプション
Snowflakeのデフォルトでは、作成されたテーブルのバックアップが常に作成されるため、 FDM が追加されます。
入力コード:
CREATE TABLE table1
BACKUP NO
AS SELECT * FROM table_test;
出力コード:
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;
YESオプション
Snowflakeのデフォルトでは、作成されたテーブルにバックアップが適用されるため、このオプションは削除されます。
入力コード:
CREATE TABLE table1
BACKUP YES
AS SELECT * FROM table_test;
出力コード:
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;
Related EWIs
SSC-FDM-RS0001: 「オプション」はサポートされていません。データストレージはSnowflakeが自動的に処理します。
テーブルスタート: COLUMNS
Description
新しいテーブルの列の名前。列名が提供されない場合、列名はクエリの出力列名から取られます。
この構文に関するAmazon Redshiftのドキュメントページに移動するには、 ここをクリックしてください。
Grammar Syntax
( column_name [, ... ] )
Sample Source Patterns
Input Code:
CREATE TABLE table1
(
col1, col2, col3
)
AS SELECT col1, col2, col3 FROM table_test;
出力コード:
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;
Related EWIs
既知の問題はありません。
テーブルスタート: LOCAL
Description
Amazon Redshiftでは、 LOCAL TEMPORARY
または TEMP
が、セッションの間だけ存在する仮テーブルを作成するために使用されます。これらのテーブルはセッション固有のもので、セッションが終了すると自動的に削除されます。これらは、恒久的なデータベーススキーマに影響を与えることなく、中間結果や作業データを保存するのに便利です。
この構文に関するAmazon Redshiftのドキュメントページに移動するには、 ここをクリックしてください。
Grammar Syntax
LOCAL { TEMPORARY | TEMP }
Sample Source Patterns
Input Code:
CREATE LOCAL TEMP TABLE table1
AS SELECT FROM table_test;
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;
Related EWIs
既知の問題はありません。
Tabla属性: DISTKEY
Description
Amazon Redshiftでは、 DISTKEY
が、クエリのパフォーマンスを最適化するためにクラスタノード間でデータを分散するために使用されます。しかし、Snowflakeは、明示的な分散キーを必要とせずに、データの分散とストレージを自動的に処理します。アーキテクチャとデータ管理アプローチの違いにより、SnowflakeにはRedshiftの DISTKEY
に直接相当するものはありません。これらの理由から、ステートメント DISTKEY
は変換処理中に削除されます
この構文に関するAmazon Redshiftのドキュメントページに移動するには、 ここ をクリックしてください。
Grammar Syntax
DISTKEY ( column_name )
Sample Source Patterns
Input Code:
CREATE TABLE table1
DISTKEY (col1)
AS SELECT * FROM table_test;
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;
Related EWIs
SSC-FDM-RS0001: 「オプション」はサポートされていません。データストレージはSnowflakeが自動的に処理します。
Tabla属性: DISTSTYLE
Description
テーブル全体のデータ配布スタイルを定義するキーワード。
この構文に関するAmazon Redshiftのドキュメントページに移動するには、 ここ をクリックしてください。
Grammar Syntax
DISTSTYLE { AUTO | EVEN | KEY | ALL }
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;
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;
Related EWIs
SSC-FDM-RS0001: 「オプション」はサポートされていません。データストレージはSnowflakeが自動的に処理します。
Tabla属性: SORTKEY
Description
列がテーブルのソートキーであることを指定するキーワード。Snowflakeでは、どちらもクエリパフォーマンスのためにデータストレージを最適化するため、Redshiftの SORTKEY
を CLUSTER BY
に移行することができます。Snowflakeの CLUSTER BY
は、Redshiftの SORTKEY
がデータを順序付けるのと同様に、指定した列でデータを整理します。
この構文に関するAmazon Redshiftのドキュメントページに移動するには、 ここ をクリックしてください。
Grammar Syntax
[ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] )
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;
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;
Related EWIs
SSC-FDM-RS0002: CLUSTER BY のパフォーマンスは、Sortkeyのパフォーマンスと比較して異なる場合があります。