SnowConvert: Redshift SQL-Anweisungen

CALL

Beschreibung

Führt eine gespeicherte Prozedur aus. Der Befehl CALL muss den Namen der Prozedur und die Werte der Eingabeargumente enthalten. Sie müssen eine gespeicherte Prozedur mit der Anweisung CALL aufrufen. (Redshift SQL-Referenz: CALL).

Warnung

Diese Syntax wird in Snowflake teilweise unterstützt. Prozeduraufrufe, die Ausgabeparameter verwenden, werden mit dem Tag SSC-EWI-0073 versehen. Diese Transformation wird in der Zukunft stattfinden.

Grammatikalische Syntax

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

Beispielhafte Quellcode-Muster

Basis-Szenario

Eingabecode:
 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
Ausgabecode:
 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

Aufruf im Modus Ausgabeparameter (INOUT, OUT)

Eingabecode:
 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
Ausgabecode:
 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

Bekannte Probleme

  • Ausgabeparameter werden derzeit in Prozeduraufrufen nicht unterstützt.

CREATE DATABASE

Grammatikalische Syntax

 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

Weitere Informationen finden Sie in der Redshift [CREATE DATABASE-Dokumentation](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE. html).

Beispielhafte Quellcode-Muster

Grundlegende Beispiele

Eingabecode:
 CREATE DATABASE database_name;
Copy
Ausgabecode:
 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-Klausel

Eingabecode:
 CREATE DATABASE database_collate
COLLATE CASE_INSENSITIVE;
Copy
Ausgabecode:
 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-Klausel

Eingabecode:
 CREATE DATABASE database_connection
CONNECTION LIMIT UNLIMITED;
Copy
Ausgabecode:
 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

Warnung

Die CONNECTION LIMIT-Klausel wird entfernt, da die Verbindung in Snowflake von Warehouse verwaltet wird. Weitere Informationen finden Sie hier.

from ARN-Klausel

Eingabecode:
 CREATE DATABASE database_fromARN
FROM ARN 'arn' WITH NO DATA CATALOG SCHEMA IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name';
Copy
Ausgabecode:
 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

Warnung

Diese Klausel wird entfernt, da sie zur Referenzierung von Amazon-Ressourcen verwendet wird, die in Snowflake nicht gültig sind.

FROM DATASHARE-Klausel

Eingabecode
 CREATE DATABASE database_fromDatashare
FROM DATASHARE datashare_name OF NAMESPACE 'namespace_guid';
Copy
Ausgabecode
 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

Bemerkung

Die Umgestaltung von Datashare ist für die Zukunft geplant.

OWNER-Klausel

Eingabecode
 CREATE DATABASE database_Owner
OWNER db_owner
ENCODING 'encoding';
Copy
Ausgabecode
 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

Warnung

Bitte beachten Sie, dass in diesem Fall die OWNER-Klausel aus dem Code entfernt wird, da Snowflake-Datenbanken im Besitz von Rollen und nicht von einzelnen Benutzern sind. Weitere Informationen finden Sie in der Snowflake GRANT OWNERSHIP-Dokumentation.

ISOLATION LEVEL-Klausel

Eingabecode
 CREATE DATABASE database_Isolation
ISOLATION LEVEL SNAPSHOT;
Copy
Ausgabecode
 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

Bemerkung

Die Umstellung auf Isolationslevel ist für die Zukunft geplant.

Zugehörige EWIs

  • [SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend

CREATE EXTERNAL TABLE

Beschreibung

Derzeit wandelt Snowconvert CREATE EXTERNAL TABLES in reguläre Tabellen um, was zusätzlichen Aufwand bedeutet, da die in externen RedShift-Tabellen gespeicherten Daten in die Snowflake-Datenbank übertragen werden müssen.

Grammatikalische Syntax

 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

Klicken Sie [hier](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE. html), um die Spezifikation für diese Syntax aufzurufen.

Beispielhafte Quellcode-Muster

Eingabecode:

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

Create External Table AS

Eingabecode:
 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
Ausgabecode:
 --** 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

Empfehlungen

Zugehörige EWIs

  1. [SSC-FDM-0004](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0004): Externe Tabelle in reguläre Tabelle übersetzt

CREATE MATERIALIZED VIEW

Beschreibung

In Snowconvert werden materialisierten Ansichten in Redshift in dynamische Tabellen in Snowflake umgewandelt. Um dynamische Tabellen richtig zu konfigurieren, müssen zwei wesentliche Parameter definiert werden: TARGET_LAG und WAREHOUSE. Wenn diese Parameter in den Konfigurationsoptionen nicht angegeben werden, verwendet Snowconvert während der Konvertierung die voreingestellten Werte, wie im folgenden Beispiel gezeigt.

Für weitere Informationen über materialisierte Ansichten klicken Sie hier.

Einzelheiten zu den erforderlichen Parametern für dynamische Tabellen finden Sie hier.

Grammatikalische Syntax

Im Folgenden finden Sie die SQL-Syntax zum Erstellen einer Ansicht in Amazon Redshift. Klicken Sie hier bis hier, um zur Redshift-Spezifikation für diese Syntax zu gelangen.

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

Beispielhafte Quellcode-Muster

Eingabecode:

 CREATE MATERIALIZED VIEW mv_baseball AS
SELECT ball AS baseball FROM baseball_table;
Copy
Ausgabecode:
 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

Bemerkung

Die Dokumentation zu den Tabellenattributen finden Sie in der folgenden Dokumentation:

Warnung

Die BACKUP- und AUTO REFRESH-Klauseln werden gelöscht, da sie in einer dynamischen Tabelle von Snowflake nicht anwendbar sind

Zugehörige EWIs

  • [SSC-FDM-0031](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0031): Erforderliche Parameter der dynamischen Tabelle standardmäßig eingestellt

CREATE SCHEMA

Grammatikalische Syntax

 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

Weitere Informationen finden Sie in der [Redshift CREATE SCHEMA- Dokumentation](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_SCHEMA. html).

Beispielhafte Quellcode-Muster

Grundlegende Beispiele

Eingabecode:
 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
Ausgabecode:
 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-Klausel

Eingabecode:
 CREATE SCHEMA s1 AUTHORIZATION miller;
Copy
Ausgabecode:
 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

Warnung

Bitte beachten Sie, dass in diesem Fall die Autorisierungs-Klausel aus dem Code entfernt wird, da Snowflake-Schemata im Besitz von Rollen und nicht von einzelnen Benutzern sind. Weitere Informationen finden Sie in der Snowflake GRANT OWNERSHIP-Dokumentation.

QUOTA-Klausel

Eingabecode:
 CREATE SCHEMA s1 QUOTA UNLIMITED;

CREATE SCHEMA s2 QUOTA 10 TB;
Copy
Ausgabecode:
 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

Bemerkung

In Snowflake ist es nicht erlaubt, eine Quote pro Schema zu definieren. Die Speicherverwaltung erfolgt auf Konto- und Warehouse-Level und wird von Snowflake automatisch durchgeführt. Aus diesem Grund wird sie aus dem Code entfernt.

Create Schema-Autorisierung

Wenn in Redshift der Name des Schemas nicht angegeben wird, aber die AUTHORIZATION-Klausel für die Berechtigung definiert ist, wird ein neues Schema mit dem Namen des Eigentümers erstellt. Aus diesem Grund wird diese Verhaltensweise in Snowflake repliziert.

Eingabecode:
 CREATE SCHEMA AUTHORIZATION miller;
Copy
Ausgabecode:
 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

Zugehörige EWIs

Es gibt keine bekannten Probleme.

CREATE VIEW

Beschreibung

Dieser Befehl erstellt eine Ansicht in einer Datenbank, die jedes Mal ausgeführt wird, wenn die Ansicht in einer Abfrage referenziert wird. Mit der Klausel WITH NO SCHEMA BINDING können Sie Ansichten auf eine externe Tabelle oder auf Objekte erstellen, die noch nicht existieren. Diese Klausel verlangt jedoch, dass Sie den qualifizierten Namen des Objekts oder der Tabelle angeben, auf die Sie verweisen.

Grammatikalische Syntax

Im Folgenden finden Sie die SQL-Syntax zum Erstellen einer Ansicht in Amazon Redshift. Klicken Sie [hier](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_VIEW. html) bis hier, um zur Redshift-Spezifikation für diese Syntax zu gelangen.

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

Beispielhafte Quellcode-Muster

Unter Berücksichtigung der obligatorischen und optionalen Klauseln in Redshifts Befehl ist die Ausgabe nach der Migration zu Snowflake sehr ähnlich.

Eingabecode:

 CREATE VIEW myuser
AS 
SELECT lastname FROM users;


CREATE VIEW myuser2
AS 
SELECT lastname FROM users2
WITH NO SCHEMA BINDING;
Copy
Ausgabecode:
 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

Es gibt jedoch einige Ausnahmen von einer nicht unterstützten Klausel von Redshift, daher wurde ein EWI implementiert, um diesen Fall abzudecken.

Zugehörige EWIs

  • [SSC-EWI-RS0003](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/redshiftEWI. md#ssc-ewi-rs0003): Die Anweisung ohne Schemabindung wird in Snowflake nicht unterstützt.

DELETE

Beschreibung

Löscht Zeilen aus Tabellen. (Redshift SQL-Referenz: DELETE-Anweisung).

Diese Syntax wird in Snowflake vollständig unterstützt.

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

Datenkonfiguration

 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-Klausel

Aktualisieren Sie eine Tabelle, indem Sie Informationen aus anderen Tabellen referenzieren. In Redshift ist das Schlüsselwort FROM optional, aber in Snowflake ist es obligatorisch. Daher wird sie in Fällen, in denen sie fehlt, hinzugefügt.

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-Klausel

Schränkt Aktualisierungen auf Zeilen ein, die eine Bedingung erfüllen. Wenn die Bedingung den Wert „true“ liefert, werden die angegebenen SET-Spalten aktualisiert. Die Bedingung kann ein einfaches Prädikat für eine Spalte sein oder eine Bedingung, die auf dem Ergebnis einer Unterabfrage basiert. Diese Klausel ist in Snowflake vollständig gleichwertig.

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

SELECT * FROM employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

10

John

Sales

3

11

Joe

Engineering

5

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

SELECT * FROM
    employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

10

John

Sales

3

11

Joe

Engineering

5

USING-Klausel

Diese Klausel führt eine Liste von Tabellen ein, wenn in der Bedingung der WHERE-Klausel auf zusätzliche Tabellen verwiesen wird. Diese Klausel ist in Snowflake vollständig gleichwertig.

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

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

Marketing

2

5

Eva

Marketing

4

6

Frank

Marketing

4

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

11

Joe

Engineering

5

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

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

Marketing

2

5

Eva

Marketing

4

6

Frank

Marketing

4

7

Grace

Engineering

6

8

Helen

Engineering

7

9

Ivy

Engineering

7

11

Joe

Engineering

5

WITH-Klausel.

Diese Klausel gibt einen oder mehrere allgemeine Tabellenausdrücke (CTE) an. Die Namen der Ausgabespalten sind optional für nicht-rekursive CTEs, aber obligatorisch für rekursive.

Da diese Klausel nicht in einer DELETE-Anweisung verwendet werden kann, wird sie in temporäre Tabellen mit ihren entsprechenden Abfragen umgewandelt. Nachdem die Anweisung DELETE ausgeführt wurde, werden diese temporären Tabellen gelöscht, um aufzuräumen, Ressourcen freizugeben und Namenskollisionen bei der Erstellung von Tabellen innerhalb derselben Sitzung zu vermeiden. Wenn außerdem eine reguläre Tabelle mit demselben Namen existiert, hat diese wieder Vorrang, da die temporäre Tabelle Vorrang vor jeder anderen Tabelle mit demselben Namen in derselben Sitzung hat.

Nicht-rekursive CTE
Input Code:
 WITH sales_employees AS (
    SELECT id
    FROM employees
    WHERE department = 'Sales'
), engineering_employees AS (
    SELECT id
    FROM employees
    WHERE department = 'Engineering'
)
DELETE FROM employees
WHERE id IN (SELECT id FROM sales_employees)
   OR id IN (SELECT id FROM engineering_employees);

SELECT * FROM employees ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

Marketing

2

5

Eva

Marketing

4

6

Frank

Marketing

4

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

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

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

SELECT * FROM
    employees
ORDER BY id;
Copy

ID

NAME

DEPARTMENT

MANAGER_ID

4

David

Marketing

2

5

Eva

Marketing

4

6

Frank

Marketing

4

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

    UNION ALL

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

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

10

John

Sales

3

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

       UNION ALL

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

ID

NAME

DEPARTMENT

MANAGER_ID

1

Alice

Sales

2

2

Bob

Sales

1

3

Charlie

Sales

1

10

John

Sales

3

Materialisierte Ansicht löschen

In Redshift können Sie die Anweisung DELETE auf materialisierte Ansichten anwenden, die für Streaming-Aufnahme verwendet werden. In Snowflake werden diese Ansichten in dynamische Tabellen umgewandelt, und die DELETE-Anweisung kann nicht für dynamische Tabellen verwendet werden. Aus diesem Grund wird eine EWI hinzugefügt.

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

  • Um die Funktionalität der WITH-Klausel zu replizieren, müssen temporäre Tabellen erstellt werden, die jeden allgemeinen Tabellenausdruck (Common Table Expression, CTE) widerspiegeln. Dieser Ansatz schlägt jedoch fehl, wenn in der aktuellen Sitzung bereits eine temporäre Tabelle mit demselben Namen existiert, was einen Fehler verursacht.

Related EWIs

  1. [SSC-FDM-0031](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/generalFDM. md#ssc-fdm-0031): Standardmäßig festgelegte erforderliche Parameter für dynamische Tabellen.

  2. [SSC-EWI-RS0008](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/redshiftEWI. md#ssc-ewi-rs0008): Die DELETE-Anweisung kann nicht für dynamische Tabellen verwendet werden.

INSERT

Description

Fügt neue Zeilen in eine Tabelle ein. (Redshift SQL-Referenz: INSERT-Anweisung).

Warnung

Diese Syntax wird in Snowflake teilweise unterstützt.

Grammatikalische Syntax

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

Beispielhafte Quellcode-Muster

Datenkonfiguration

 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

Standardwerte

Es wird eine komplette Zeile mit ihren Standardwerten eingefügt. Wenn es Spalten gibt, die keine Standardwerte haben, werden in diese Spalten NULL-Werte eingefügt.

Diese Klausel kann keine einzelnen Spalten angeben; sie fügt immer eine komplette Zeile mit ihren Standardwerten ein. Außerdem können Spalten mit der Einschränkung NOT NULL nicht in die Tabellendefinition aufgenommen werden. Um diese Verhaltensweise in Snowflake zu replizieren, fügen Sie unter SnowConvert eine Spalte mit einem DEFAULT-Wert in die Tabelle ein. Diese Aktion fügt eine komplette Zeile ein, wobei für jede Spalte der Standardwert verwendet wird.

Eingabecode:
 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

Marketing

Ausgabecode:
 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

Marketing

Abfrage

Fügen Sie mit Hilfe einer Abfrage eine oder mehrere Zeilen in die Tabelle ein. Alle Zeilen, die durch die Abfrage erzeugt werden, werden in die Tabelle eingefügt. Die Abfrage muss eine Spaltenliste zurückgeben, die mit den Spalten der Tabelle kompatibel ist, obwohl die Spaltennamen nicht übereinstimmen müssen. Diese Funktionalität ist in Snowflake vollständig gleichwertig.

Eingabecode:
 INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM new_employees;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Grace Lee

32000

Operationen

2

Hannah Gray

26000

Finanzen

Ausgabecode:
 INSERT INTO employees (name, salary, department)
SELECT name, salary, department FROM
    new_employees;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Grace Lee

32000

Operationen

2

Hannah Gray

26000

Finanzen

Bekannte Probleme

  • Bestimmte Ausdrücke können nicht in der VALUES-Klausel in Snowflake verwendet werden. In Redshift kann zum Beispiel die Funktion [JSON_PARSE](https://docs.aws.amazon.com/redshift/latest/dg/JSON_PARSE. html) innerhalb der VALUES-Klausel verwendet werden, um einen JSON-Wert in einen SUPER-Datentyp einzufügen. In Snowflake kann die Funktion PARSE_JSON jedoch nicht in der VALUES-Klausel verwendet werden, um einen JSON-Wert in einen VARIANT-Datentyp einzufügen. Stattdessen kann eine Abfrage anstelle der VALUES-Klausel verwendet werden. Weitere Einzelheiten entnehmen Sie bitte der Snowflake-Dokumentation. Weitere Informationen finden Sie auch im folgenden Artikel.

Zugehörige EWIs

Es gibt keine bekannten Probleme.

MERGE

Grammatikalische Syntax

 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

Weitere Informationen finden Sie in der Redshift MERGE-Dokumentation.

Beispielhafte Quellcode-Muster

UPDATE - INSERT

Es gibt keine Unterschiede zwischen den beiden Sprachen. Der Code wird in seiner ursprünglichen Form beibehalten.

Eingabecode:
 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
Ausgabecode:
 --** 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

Es gibt keine Unterschiede zwischen den beiden Sprachen. Der Code wird in seiner ursprünglichen Form beibehalten.

Eingabecode:
 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
Ausgabecode:
 --** 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

Die Klausel REMOVE DUPLICATES wird in Snowflake nicht unterstützt. Es gibt jedoch einen Umgehungsmöglichkeit, mit der die ursprüngliche Verhaltensweise emuliert werden kann.

Der Ausgabecode wird drei neue Anweisungen enthalten:

  • Eine TEMPORARY TABLE mit den doppelten Werten aus der Quell- und Zieltabelle, die die Bedingung erfüllen

  • Eine INSERT-Anweisung, die die ausstehenden Werte nach der Zusammenführung zur Zieltabelle hinzufügt

  • Eine DROP-Anweisung, die die erzeugte temporäre Tabelle löscht.

Diese sind notwendig, da die Verhaltensweise von DROP DUPLICATES die doppelten Werte aus der Zieltabelle entfernt und dann die Werte, die der Bedingung entsprechen, aus der Quelltabelle einfügt.

Eingabecode:
 CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

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

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

ID

NAME

30

Daisy

22

Clarence

30

Tony

11

Alice

23

David

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

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

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

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

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

SELECT
*
FROM
source_duplicates;

DROP TABLE IF EXISTS source_duplicates CASCADE;
Copy

ID

NAME

22

Clarence

30

Tony

30

Daisy

11

Alice

23

David

Bekannte Probleme

Es gibt keine bekannten Probleme.

Zugehörige EWIs

  1. [SSC-EWI-RS0009](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/redshiftEWI. md#ssc-ewi-rs0009): Semantische Informationen für die Quelltabelle nicht gefunden.

  2. [SSC-FDM-RS0005](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/redshiftFDM. md#ssc-fdm-rs0005): Duplikate in der Quelltabelle nicht erlaubt.

UPDATE

Beschreibung

Aktualisiert Werte in einer oder mehreren Tabellenspalten, wenn eine Bedingung erfüllt ist. (Redshift SQL-Referenz: UPDATE-Anweisung).

Diese Syntax wird in Snowflake vollständig unterstützt.

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

Alias

Obwohl die Grammatik von Snowflake nicht vorschreibt, dass ein Tabellenalias verwendet werden kann, ist dies in Snowflake gültiger Code.

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

505000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

405000

Marketing

5

Eva

455000

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

395000

Marketing

9

Ivy

485000

HR

10

Jack

425000

Engineering

11

Ken

700000

Marketing

12

Liam

600000

Engineering

13

Mona

475000

HR

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

505000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

405000

Marketing

5

Eva

455000

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

395000

Marketing

9

Ivy

485000

HR

10

Jack

425000

Engineering

11

Ken

700000

Marketing

12

Liam

600000

Engineering

13

Mona

475000

HR

WITH clause

Diese Klausel gibt einen oder mehrere allgemeine Tabellenausdrücke (CTE) an. Die Namen der Ausgabespalten sind optional für nicht-rekursive CTEs, aber obligatorisch für rekursive.

Da diese Klausel nicht in einer UPDATE-Anweisung verwendet werden kann, wird sie in temporäre Tabellen mit ihren entsprechenden Abfragen umgewandelt. Nachdem die Anweisung UPDATE ausgeführt wurde, werden diese temporären Tabellen gelöscht, um aufzuräumen, Ressourcen freizugeben und Namenskollisionen bei der Erstellung von Tabellen innerhalb derselben Sitzung zu vermeiden. Wenn außerdem eine reguläre Tabelle mit demselben Namen existiert, hat diese wieder Vorrang, da die temporäre Tabelle Vorrang vor jeder anderen Tabelle mit demselben Namen in derselben Sitzung hat.

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

500000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

546923

Marketing

5

Eva

546923

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

546923

Marketing

9

Ivy

546923

HR

10

Jack

546923

Engineering

11

Ken

700000

Marketing

12

Liam

600000

Engineering

13

Mona

546923

HR

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

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

DROP TABLE avg_salary_cte;
Copy

ID

NAME

SALARY

DEPARTMENT

1

Alice

500000

HR

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

546923

Marketing

5

Eva

546923

HR

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

546923

Marketing

9

Ivy

546923

HR

10

Jack

546923

Engineering

11

Ken

700000

Marketing

12

Liam

600000

Engineering

13

Mona

546923

HR

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

526666

HR

2

Bob

670000

Engineering

3

Charlie

773333

Engineering

4

David

433333

Marketing

5

Eva

475000

HR

6

Frank

825000

Engineering

7

Grace

721666

Engineering

8

Helen

423000

Marketing

9

Ivy

506000

HR

10

Jack

484000

Engineering

11

Ken

743333

Marketing

12

Liam

670000

Engineering

13

Mona

495668

HR

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

526667

HR

2

Bob

670000

Engineering

3

Charlie

773333

Engineering

4

David

433333

Marketing

5

Eva

475000

HR

6

Frank

825000

Engineering

7

Grace

721667

Engineering

8

Helen

423000

Marketing

9

Ivy

506000

HR

10

Jack

484000

Engineering

11

Ken

743333

Marketing

12

Liam

670000

Engineering

13

Mona

495667

HR

SETDEFAULT-Werte

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

20000

Sales

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

400000

Marketing

5

Eva

20000

Sales

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

390000

Marketing

9

Ivy

20000

Sales

10

Jack

420000

Engineering

11

Ken

700000

Marketing

12

Liam

600000

Engineering

13

Mona

20000

Sales

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

ID

NAME

SALARY

DEPARTMENT

1

Alice

20000

Sales

2

Bob

600000

Engineering

3

Charlie

700000

Engineering

4

David

400000

Marketing

5

Eva

20000

Sales

6

Frank

750000

Engineering

7

Grace

650000

Engineering

8

Helen

390000

Marketing

9

Ivy

20000

Sales

10

Jack

420000

Engineering

11

Ken

700000

Marketing

12

Liam

600000

Engineering

13

Mona

20000

Sales

SET-Klausel.

Sie ist für die Änderung der Werte in den Spalten verantwortlich. Ähnlich wie bei Snowflake werden Aktualisierungsabfragen mit mehreren Übereinstimmungen pro Zeile einen Fehler auslösen, wenn der Konfigurationsparameter ERROR_ON_NONDETERMINISTIC_UPDATE auf „true“ gesetzt ist. Dieses Flag funktioniert in Snowflake auf die gleiche Weise und verwendet sogar den gleichen Namen: ERROR_ON_NONDETERMINISTIC_UPDATE.

Wenn dieses Flag jedoch deaktiviert ist, wird kein Fehler zurückgegeben, und eine der übereinstimmenden Zeilen wird zur Aktualisierung der Zielzeile verwendet. Die ausgewählte verbundene Zeile ist in beiden Sprachen nicht deterministisch und willkürlich. Die Verhaltensweise ist möglicherweise bei verschiedenen Ausführungen nicht konsistent, was zu Dateninkonsistenzen führen kann.

Datenkonfiguration:
 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

  • Aktualisierungsabfragen mit mehreren Übereinstimmungen pro Zeile können zu Dateninkonsistenzen führen. Obwohl beide Plattformen über das Kennzeichen ERROR_ON_NONDETERMINISTIC_UPDATE verfügen, sind diese Werte immer nicht deterministisch. Snowflake bietet Empfehlungen für den Umgang mit diesen Szenarien. Klicken Sie hier für weitere Details.

  • Um die Funktionalität der WITH-Klausel zu replizieren, müssen temporäre Tabellen erstellt werden, die jeden allgemeinen Tabellenausdruck (Common Table Expression, CTE) widerspiegeln. Dieser Ansatz schlägt jedoch fehl, wenn in der aktuellen Sitzung bereits eine temporäre Tabelle mit demselben Namen existiert, was einen Fehler verursacht.

Related EWIs

Es gibt keine bekannten Probleme.

CREATE TABLE AS

Description

Erstellt eine neue Tabelle auf der Grundlage einer Abfrage. Der Eigentümer dieser Tabelle ist der Benutzer, der den Befehl ausgibt.

Weitere Informationen finden Sie in der Dokumentation [CREATE TABLE AS](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_AS. html).

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

Tabellenstart: BACKUP

Description

Ermöglicht Amazon Redshift die automatische Anpassung des Kodierungstyps für alle Spalten in der Tabelle, um die Abfrageleistung zu optimieren. In Snowflake ist das Konzept von BACKUP, wie es in anderen Datenbanken üblich ist, nicht direkt anwendbar. Snowflake übernimmt automatisch die Datensicherung und -wiederherstellung durch seine integrierten Features wie Time Travel und Fail-safe, so dass keine manuellen Sicherungs-Operationen mehr erforderlich sind. Aus diesen Gründen wird die Anweisung BACKUP während des Transformationsprozesses entfernt

Klicken Sie hier, um zur Seite mit der Amazon Redshift-Dokumentation für diese Syntax zu navigieren.

Grammar Syntax

 BACKUP { YES | NO }
Copy

Sample Source Patterns

NO-Option

Ein FDM wird hinzugefügt, da Snowflake standardmäßig immer eine Sicherung der erstellten Tabelle erstellt.

Eingabecode:

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

Ausgabecode:

 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-Option

Die Option wird entfernt, da Snowflake standardmäßig ein Backup der erstellten Tabelle anlegt.

Eingabecode:

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

Ausgabecode:

 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](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/redshiftFDM. md#ssc-fdm-rs0001): „Option“ wird nicht unterstützt. Der Datenspeicher wird automatisch von Snowflake verwaltet.

Tabellenstart: COLUMNS

Description

Der Name einer Spalte in der neuen Tabelle. Wenn keine Spaltennamen angegeben werden, werden die Spaltennamen aus den Ausgabespaltennamen der Abfrage übernommen.

Klicken Sie hier [](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW. html), um Seite mit der Amazon Redshift-Dokumentation für diese Syntax zu gelangen.

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

Ausgabecode:

 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

Es gibt keine bekannten Probleme.

Tabellenstart: LOCAL

Description

In Amazon Redshift werden LOCAL TEMPORARY oder TEMP verwendet, um temporäre Tabellen zu erstellen, die nur für die Dauer der Sitzung existieren. Diese Tabellen sind sitzungsspezifisch und werden automatisch gelöscht, wenn die Sitzung endet. Sie sind nützlich, um Zwischenergebnisse oder Arbeitsdaten zu speichern, ohne das permanente Datenbankschema zu beeinflussen.

Klicken Sie hier [](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW. html), um Seite mit der Amazon Redshift-Dokumentation für diese Syntax zu gelangen.

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

Es gibt keine bekannten Probleme.

Tabellenattribute: DISTKEY

Description

In Amazon Redshift wird DISTKEY verwendet, um die Daten auf die Clusterknoten zu verteilen und so die Abfrageleistung zu optimieren. Snowflake hingegen kümmert sich automatisch um die Verteilung und Speicherung von Daten, ohne dass explizite Verteilungsschlüssel benötigt werden. Aufgrund der unterschiedlichen Architektur und Datenverwaltungsansätze hat Snowflake kein direktes Äquivalent zu DISTKEY von Redshift. Aus diesen Gründen wird die Anweisung DISTKEY während des Transformationsprozesses entfernt

Klicken Sie hier, um zur Seite mit der Amazon Redshift-Dokumentation für diese Syntax zu navigieren.

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](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/redshiftFDM. md#ssc-fdm-rs0001): „Option“ wird nicht unterstützt. Der Datenspeicher wird automatisch von Snowflake verwaltet.

Tabellenattribute: DISTSTYLE

Description

Schlüsselwort, das den Stil der Datenverteilung für die gesamte Tabelle definiert.

Klicken Sie hier, um zur Seite mit der Amazon Redshift-Dokumentation für diese Syntax zu navigieren.

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](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/redshiftFDM. md#ssc-fdm-rs0001): „Option“ wird nicht unterstützt. Der Datenspeicher wird automatisch von Snowflake verwaltet.

Tabellenattribute: SORTKEY

Description

Das Schlüsselwort, das angibt, dass die Spalte der Sortierschlüssel für die Tabelle ist. In Snowflake kann SORTKEY von Redshift auf CLUSTER BY migriert werden, da beide den Datenspeicher für die Abfrageleistung optimieren. CLUSTER BY in Snowflake organisiert die Daten nach bestimmten Spalten, ähnlich wie SORTKEY die Daten in Redshift ordnet.

Klicken Sie hier, um zur Seite mit der Amazon Redshift-Dokumentation für diese Syntax zu navigieren.

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](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/redshiftFDM. md#ssc-fdm-rs0002): Die Leistung von CLUSTER BY kann im Vergleich zur Leistung von Sortkey variieren.