SnowConvert AI - SQL サーバーとAzure Synapse - DMLs¶
BETWEEN¶
入力式(数値または文字列)が指定された下限および上限内にある場合、 TRUE を返します。
Applies to
SQL Server
Azure Synapse Analytics
注釈
わかりやすくするため、出力コードの一部を省略しています。
ソースコード
期待されるコード
BULK に INSERT¶
一括挿入ステートメントの翻訳リファレンス。
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
BULK INSERT の直訳はSnowflake COPY INTO ステートメントです。COPY INTO は、値を取得するためにファイルパスを直接使用しません。ファイルは STAGE 内に事前に存在している必要があります。また、 BULK INSERT で使用されるオプションは、 STAGE で消費される、または直接 COPY INTO で消費されるSnowflake FILE FORMAT で指定する必要があります。
STAGE にファイルを追加するには、 PUT コマンドを使用します。コマンドは SnowSQL CLI からのみ実行できることに注意してください。以下は、 COPY INTO を実行する前に行うべきステップの例です。
SQL Server¶
Snowflake¶
As you see in the code above, SnowConvert AI identifies all the BULK INSERTS in the code, and for each instance, a new STAGE and FILE FORMAT will be created before the copy into execution. In addition, after the creation of the STAGE, a PUT command will be created as well to add the file to the stage.
The names of the generated statements are auto-generated using the current timestamp in seconds, to avoid collisions between their usages.
最後に、一括挿入のすべてのオプションは、該当する場合、ファイル形式オプションにマッピングされています。オプションがSnowflakeでサポートされていない場合は、コメントされ、警告が追加されます。SSC-FDM-TS0004も参照してください。
サポートされている一括オプション¶
SQL Server |
Snowflake |
|---|---|
FORMAT |
TYPE |
FIELDTERMINATOR |
FIELD_DELIMITER |
FIRSTROW |
SKIP_HEADER |
ROWTERMINATOR |
RECORD_DELIMITER |
FIELDQUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
共通テーブル式(CTE)¶
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
Snowflake SQL では、共通テーブル式がデフォルトでサポートされています。
構文¶
Snowflake SQL¶
サブクエリ:
再帰的 CTE:
条件:
注目すべき詳細¶
The RECURSIVE keyword does not exist in T-SQL, and the transformation does not actively add the keyword to the result. A warning is added to the output code to state this behavior.
SELECT INTO を用いた共通テーブル式¶
WITH 式の後に SELECT INTO ステートメントが続くと、次の変換が発生し、 TEMPORARY TABLE に変換されます。
SQL Server:¶
Snowflake:¶
他の式との共通テーブル式¶
WITH 式の後に INSERT または DELETE ステートメントが続くと、以下の変換が行われます。
SQL Server:¶
Snowflake:¶
Delete Fromを使用した共通テーブル式¶
この変換では、Delete Fromを持つ CTE (共通テーブル式)に対してのみ適用されますが、一部の仕様 CTE に対してのみ適用されます。CTE を1つだけ持ち、 ROW_NUMBER または RANK の関数を内部に持たなければなりません。
Deleteを使った CTE の目的は、テーブルから重複を削除することでなければなりません。Deleteを使った CTE が別の種類のデータを削除することを意図している場合、この変換は適用されません。
例を見てみましょう。例として、まずデータの入ったテーブルを作成します。
値が重複していることに注意してください。8行目と12行目には同じ値が挿入されています。では、テーブルの重複行を削除します。
テーブルからSelectを実行すると、次のような結果が表示されます
ID |
値 |
StringValue |
|---|---|---|
100 |
100 |
名 |
200 |
200 |
秒 |
300 |
300 |
Third |
400 |
400 |
Fourth |
Note that the duplicated rows have been removed. To preserve this functionality in Snowflake, which does not support DELETE from a CTE, SnowConvert transforms the statement into the following:
ご覧のように、クエリはCreate Or Replace Tableに変換されます。
To test it in Snowflake, you will need the table.
ここで、変換の結果を実行し、重複行が削除されたかどうかをチェックするためにSelectを実行すると、このようになります。
ID |
値 |
StringValue |
|---|---|---|
100 |
100 |
名 |
200 |
200 |
秒 |
300 |
300 |
Third |
400 |
400 |
Fourth |
MERGE ステートメントを使用した共通テーブル式¶
WITH 式の後に MERGE ステートメントが続くと、次の変換が発生し、 MERGE INTO に変換されます。
SQL Server:¶
Snowflake:¶
UPDATE ステートメントを使用した共通テーブル式¶
WITH 式の後に UPDATE ステートメントが続くと、次の変換が発生し、 UPDATE ステートメントに変換されます。
SQL Server:¶
Snowflake:¶
既知の問題¶
問題は見つかりませんでした。
関連 EWIs¶
SSC-EWI-0108: 以下のサブクエリは無効なパターンの少なくとも1つにマッチし、コンパイルエラーが発生する可能性があります。
SSC-PRF-TS0001 :パフォーマンスの警告 - CTE の再帰がチェックされていません。再帰キーワードが必要になるかもしれません。
DELETE¶
Transact-SQL DeleteステートメントをSnowflakeに変換するための翻訳リファレンス
Applies to
SQL Server
Azure Synapse Analytics
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Removes one or more rows from a table or view in SQL Server. For more information, see the SQL Server DELETE documentation.
サンプルソースパターン¶
サンプルデータ¶
SQL Server¶
Snowflake¶
基本ケース¶
DELETE ステートメントの変換は、いくつかの注意点を除き、非常に簡単です。これらの注意点の1つは、Snowflakeが FROM 句で複数のソースをサポートする方法ですが、Snowflakeには以下のように同等のものがあります。
SQL Server¶
Snowflake¶
注釈
元の DELETE はT1用であったため、 FROM 句に TABLE2 T2が存在する場合は、 USING 句を作成する必要があることに注意してください。
テーブルから重複を削除¶
以下のドキュメントでは、 SQL Serverのテーブルから重複行を削除するために使用される一般的なパターン を説明します。このアプローチでは、 ROW_NUMBER 関数を使用して、 key_value (コンマで区切られた1つまたは複数の列)に基づいてデータを分割します。次に、行番号の値が1より大きい記録をすべて削除します。この値は記録が重複していることを示します。参照されたドキュメントを読んで、このメソッドの動作を理解し、再現することができます。
次の例では、この方法を使用して、Snowflakeのテーブルと同等のものから重複を削除します。変換は、テーブルを切り捨て(すべてのデータを削除)、重複した行を無視して同じテーブルに再度行を挿入する INSERT OVERWRITE ステートメントの実行で構成されます。出力コードは、元のコードで使用されたのと同じ PARTITION BY、 ORDER BY 句を考慮して生成されます。
SQL Server¶
重複行を含むテーブルの作成
重複の挿入¶
出力¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
重複の削除¶
出力¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
Snowflake¶
重複行を含むテーブルの作成
重複の挿入¶
出力¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
重複の削除¶
出力¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
警告
このパターンにはいくつかのバリエーションがあるかもしれませんが、どれも同じ原理に基づいており、同じ構造を持っていると考えてください。
DELETE WITH INNER JOIN¶
SQL に SERVER¶
出力¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
Snowflake¶
出力¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
DELETE WITH LEFT JOIN¶
SQL Server¶
出力¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
1 |
John |
Doe |
1 |
2 |
Jane |
Smith |
2 |
3 |
ボブ |
Johnson |
1 |
4 |
アリス |
Brown |
3 |
Snowflake¶
出力¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
1 |
John |
Doe |
1 |
2 |
Jane |
Smith |
2 |
3 |
ボブ |
Johnson |
1 |
4 |
アリス |
Brown |
3 |
DELETE WITH RIGHT JOIN¶
SQL に SERVER¶
出力¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
Snowflake¶
出力¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
既知の問題¶
FULL JOIN はサポートされていません\ FULL JOIN は(+)構文を使用して示すことはできません。これが見つかると、 SnowConvert AI は FDM でユーザーにこのことを警告します。
SQL Server¶
Snowflake¶
関連 EWIs¶
SSC-EWI-TS0081 :削除ステートメントでの完全結合の使用はサポートされていません。
DROP に STATEMENT¶
DROP ステートメント
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
DROP TABLE¶
Transact-SQL¶
Snowflake¶
翻訳¶
単一の DROP TABLE ステートメントの翻訳は非常に簡単です。ステートメント内でドロップされるテーブルが1つだけである限り、そのままにしておきます。
例:
SQL ServerとSnowflakeで注目すべき唯一の違いは、入力ステートメントが複数のテーブルをドロップする場合に現れます。これらのシナリオでは、ドロップされるテーブルごとに異なる DROP TABLE ステートメントが作成されます。
例:
SQL Server¶
Snowflake¶
EXISTS¶
EXISTS ステートメント変換の詳細を使用したTransact-SQL サブクエリ
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
サブクエリのタイプ¶
サブクエリは、相関するものと相関しないものに分類できます。
相関サブクエリは、サブクエリの外部からの1つ以上の列を参照します。(通常、列はサブクエリの WHERE 句内で参照されます。)相関サブクエリは、外部クエリ内のテーブルの各行でサブクエリが評価されたかのように、それが参照するテーブルのフィルターと考えることができます。
非相関サブクエリには、そのような外部列参照はありません。これは独立したクエリであり、その結果は(行ごとではなく)外部のクエリに一度返されて使用されます。
EXISTS ステートメントは相関サブクエリとみなされます。
SQL に SERVER¶
Snowflake¶
IN¶
IN ステートメント変換の詳細を使用したTransact-SQL サブクエリ
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
IN 演算子は、ある式がサブクエリの返す値に含まれるかどうかを調べます。
SQL に SERVER¶
Snowflake¶
INSERT¶
SQL Server InsertステートメントをSnowflakeに変換するための翻訳リファレンス
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Adds one or more rows to a table or a view in SQL Server. For more information, see the SQL Server INSERT documentation.
構文比較¶
基本的な挿入文法は、 SQL 両言語間で同等です。ただし、 SQL Serverには違いを示す他の構文要素がまだいくつかあります。たとえば、開発者が割り当て演算子を使用して列に値を追加できる構文要素があります。この構文も基本的な挿入構文に変換されます。
Snowflake¶
SQL Server¶
サンプルソースパターン¶
基本的な INSERT¶
SQL Server¶
Snowflake¶
INSERT with assign operator¶
SQL Server¶
Snowflake¶
INTO を含まない INSERT¶
SQL Server¶
Snowflake¶
共通テーブル式を含む INSERT¶
SQL Server¶
Snowflake¶
MERGE を DML としてテーブル DML 要因を含む INSERT¶
これは、 INSERT ステートメントに SELECT クエリがあり、 SELECT の FROM 句に MERGE DML ステートメントが含まれる特殊なケースです。 Snowflakeで同等のものを探すと、一時テーブル、 変換されたMergeステートメント 、そしてinsertステートメントといったステートメントが作成されます。
SQL Server¶
Snowflake¶
NOTE: パターンの名前が示すように、Insertがselectを持ち...Fromの本文に MERGE ステートメントが含まれるケース ONLY です。
既知の問題¶
1.特別なマッピングを必要とする構文要素:
[INTO]: このキーワードはSnowflakeでは必須なので、存在しない場合は追加してください。
[DEFAULT VALUES]: 挿入で指定されたすべての列にデフォルト値を挿入します。VALUES (DEFAULT、 DEFAULT、...)に変換する必要があります。DEFAULTs の追加量は、挿入によって変更される列の数に等しくなります。今のところ、警告が追加されています。
SQL Server¶
Snowflake¶
2.構文要素がサポートされていないか、無関係です。
[TOP (expression) [PERCENT]]: 挿入される行の量またはパーセントを示します。サポート対象外です。
[rowset_function_limited]: OPENQUERY()または OPENROWSET()で、リモートサーバーからデータを読み込むために使用されます。サポート対象外です。
[WITH table_hint_limited]:テーブルの読み書きロックを取得するために使用されます。Snowflakeでは関係ありません。
[<OUTPUT Clause>]: 挿入された行も挿入されるテーブルまたは結果セットを指定します。サポート対象外です。
[execute_statement]: データを取得するクエリの実行に使用できます。サポート対象外です。
[dml_table_source]: 別の DML ステートメントの OUTPUT 句によって生成された仮結果セット。サポート対象外です。
3.DELETE ケースは考慮されていません。
INSERT with Table DML Factor with MERGE as DML パターンについては、 DELETE ケースがソリューションで考慮されないため、ソースコードのMergeステートメントに DELETE ケースがある場合は、想定通りに機能しない可能性があることを考慮してください。
関連 EWIs¶
SSC-EWI-0073: 機能同等性レビュー保留中。
SSC-FDM-TS0026: DELETE ケースは考慮されていません。
MERGE¶
Transact-SQL MERGE ステートメント変換の詳細
Applies to
SQL Server
Azure Synapse Analytics
構文比較¶
Snowflake¶
Transact-SQL¶
例¶
次のようなソースコードがあるとします。
SQL Server¶
次のような結果が得られると予想されます。
Snowflake¶
関連 EWIs¶
SSC-EWI-0021: 構文がSnowflakeでサポートされていません。
SELECT¶
SQL Server SelectステートメントをSnowflakeに変換するための翻訳リファレンス
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Allows the selection of one or more rows or columns of one or more tables in SQL Server. For more information, see the SQL Server SELECT documentation.
サンプルソースパターン¶
SELECT WITH COLUMN ALIASES¶
次の例は、Snowflakeで列エイリアスを使用する方法を示しています。最初の2列は、 SQL Serverコードから、 AS キーワードを使用して、割り当て形式から正規化形式に変換されることが期待されます。3列目と4列目は有効なSnowflake形式を使用しています。
SQL Server¶
Snowflake¶
SELECT TOP¶
SQL Server¶
Snowflake¶
SELECT INTO¶
次の例では、 SELECT INTO が CREATE TABLE AS に変換されています。これは、Snowflakeに SELECT INTO に相当するものがなく、クエリに基づいてテーブルを作成するには CREATE TABLE AS を使用する必要があるためです。
SQL Server¶
Snowflake¶
もう一つのケースは、 EXCEPT や INTERSECT のようなセット演算子を含む場合です。変換は基本的に前回と同じです。
SQL Server¶
Snowflake¶
SELECT TOP Additional Arguments¶
PERCENT および WITH TIES キーワードは結果に影響し、Snowflakeではサポートされていないため、コメントアウトされ、エラーとして追加されます。
SQL Server¶
Snowflake¶
SELECT FOR¶
The FOR XML clause is transformed differently depending on whether the path is empty or not.
FOR XML PATH('') — Empty path (string concatenation pattern):
FOR XML PATH('') is a common SQL Server pattern used for string concatenation (before STRING_AGG was introduced). When the path is empty and there is no ROOT clause, the query is transformed to use LISTAGG with CONCAT instead of XML functions, because the intent is string aggregation rather than XML generation.
SQL Server¶
Snowflake¶
When there is a single expression, CONCAT is omitted:
SQL Server¶
Snowflake¶
FOR XML PATH — Non-empty path (XML generation):
When the path is not empty, the FOR XML PATH clause is converted to use FOR_XML_UDF with OBJECT_CONSTRUCT to produce XML output. This conversion emits SSC-FDM-TS0016 because the resulting XML format in Snowflake may differ from SQL Server.
SQL Server¶
Snowflake¶
SELECT OPTION¶
OPTION 句はSnowflakeではサポートされていません。これはコメントアウトされ、変換時に警告として追加されます。
OPTION ステートメントは、Snowflakeでは関連性がない、または必要ないため、変換から削除されていることに注意してください。
SQL Server¶
Snowflake¶
SELECT WITH¶
WITH 句はSnowflakeではサポートされていません。これはコメントアウトされ、変換時に警告として追加されます。
WITH(NOLOCK, NOWAIT) ステートメントは、Snowflakeでは関連性がない、または必要ないため、変換から削除されていることに注意してください。
SQL Server¶
Snowflake¶
関連 EWIs¶
SSC-EWI-0040: ステートメントがサポートされていません。
SSC-FDM-TS0016:Snowflakeの XML 列は形式が異なるかもしれません
SET に OPERATORS¶
Applies to
SQL Server
Azure Synapse Analytics
TSQL とSnowflakeのセット演算子は、 TSQL でサポートされていない MINUS を除き、同じ構文とサポートされているシナリオ(EXCEPT、 INTERSECT、 UNION、 UNION ALL)を示します。その結果、変換時に同じコードが発生します。
TRUNCATE¶
Transact-SQL TRUNCATE ステートメント変換の詳細
Applies to
SQL Server
Azure Synapse Analytics
わかりやすくするため、出力コードの一部を省略しています。
SQL Server¶
Snowflake¶
UPDATE¶
SQL Server UpdateステートメントをSnowflakeに変換するための翻訳リファレンス
Applies to
SQL Server
Azure Synapse Analytics
注釈
わかりやすくするため、出力コードの一部を省略しています。
説明¶
Changes existing data in a table or view in SQL Server. For more information, see the SQL Server UPDATE documentation.
サンプルソースパターン¶
基本的な UPDATE¶
通常の UPDATE ステートメントの変換は非常に簡単です。Snowflakeでは、基本的な UPDATE 構造がデフォルトでサポートされているため、いくつか違いが見られるのは外れ値の部分です。
SQL Server¶
Snowflake¶
デカルト積¶
SQL Serverは、Updateステートメントのターゲットテーブルと FROM 句の間の循環参照の追加を許可します。実行時に、データベースオプティマイザーは、生成されたデカルト積を削除します。そうでなければ、Snowflakeは現在このシナリオを最適化せず、実行計画でチェックできるデカルト積を生成します。\
これを解決するには、テーブルの1つが更新ターゲットと同じである JOIN がある場合、この参照が削除されて WHERE 句に追加され、データのフィルター処理のみが行われ、セット操作が行われないようにするために使用されます。
SQL Server¶
Snowflake¶
OUTPUT 句¶
OUTPUT 句はSnowflakeではサポートされていません。
SQL Server¶
Snowflake¶
CTE¶
WITH CTE 句は、Snowflakeでサポートされるようにupdateステートメントの内部クエリに移動されます。
SQL Server¶
Snowflake¶
TOP 句¶
TOP 句はSnowflakeではサポートされていません。
SQL Server¶
Snowflake¶
WITH TABLE HINT LIMITED¶
Update WITH 句はSnowflakeではサポートされていません。
SQL Server¶
Snowflake¶
関連 EWIs¶
SSC-EWI-0021: 構文がSnowflakeでサポートされていません。
UPDATE WITH JOIN¶
WHERE およびJOIN 句を含む UPDATE ステートメントの翻訳仕様
警告
これは進行中の作業であり、将来変更される可能性があります。
説明¶
パターン UPDATE FROM は、他のテーブルのデータに基づいてデータを更新するために使用されます。この SQLServer ドキュメント では、単純なサンプルを提供しています。
ドキュメント にある以下の SQL Server構文を確認してください。
SQL Server構文¶
table_name: 更新するテーブルまたはビュー。SET: 列とその新しい値を指定します。SET句は、1つ以上の列に新しい値(または式)を割り当てます。FROM:1つ以上のソーステーブルを指定するために使用されます(_ join のように)_。これは、更新を実行するためのデータの出所を定義するのに役立ちます。WHERE: 条件に基づいて更新する行を指定します。この句がなければ、テーブルのすべての行が更新されます。OPTION (query_hint): クエリ最適化のためのヒントを指定します。
Snowflake構文¶
Snowflakeの構文は Snowflakeドキュメント でも確認できます。
注釈
Snowflakeは UPDATE 句の JOINs をサポートしていません。
必須パラメーター
_
target_table:_ 更新するテーブルを指定します。_
col_name:_ _target_table_ 内の列の名前を指定します。テーブル名は含めないでください。例えば、UPDATE t1 SET t1.col = 1は無効です。_
value:_ _col_name_ に設定する新しい値を指定します。
オプションのパラメーター
FROM``_additional_tables:_ 更新する行の選択や新しい値のセットに使用する1つ以上のテーブルを指定します。ターゲットテーブルを繰り返すと自己結合になることに注意してください。WHERE``_条件:_ 更新するターゲットテーブルの行を指定する式。デフォルト:値なし(ターゲットテーブルのすべての行が更新されます)
翻訳概要¶
SQL Server JOIN 型 |
Snowflakeでのお勧めの代替法 |
|---|---|
単一の |
|
複数の |
|
複数の |
サブクエリの使用 + IN 操作 |
単一の |
サブクエリの使用 + IN 操作 |
複数の |
必要に応じてステートメントを並べ替えるSnowflake |
複数の |
必要に応じてステートメントを並べ替えるSnowflake |
単一の RIGHTJOIN |
|
注-1: 単純な JOIN は、 FROM 句でテーブルを使用し、必要に応じて WHERE 句でフィルターを追加することができます。
注-2: 他のアプローチには、 JOINs を定義するための(+)オペランドが含まれる場合があります。
サンプルソースパターン¶
セットアップデータ¶
SQLServer¶
Snowflake¶
Data Insertion for samples
ケース1: 単一の INNER JOIN 更新¶
INNER JOIN の場合、 FROM ステートメント内でテーブルを使用すると、自動的に INNER JOIN になります。Snowflakeの UPDATE ステートメントで JOINs をサポートするには、いくつかのアプローチがあることに注意してください。これは、可読性を確保するための最も単純なパターンのひとつです。
SQL Server¶
出力¶
CustomerID |
数量 |
CustomerName |
|---|---|---|
1 |
10 |
ジョン・ドウ |
Snowflake¶
出力¶
CustomerID |
数量 |
CustomerName |
|---|---|---|
1 |
10 |
ジョン・ドウ |
その他のアプローチ:
MERGE INTO
IN Operation
ケース2: 複数の INNER JOIN 更新¶
SQL Server¶
出力¶
CustomerID |
数量 |
CustomerName |
|---|---|---|
3 |
5 |
アリス・ジョンソン |
Snowflake¶
出力¶
CustomerID |
数量 |
CustomerName |
|---|---|---|
3 |
5 |
アリス・ジョンソン |
ケース3: 集計条件による複数の INNER JOIN 更新¶
SQL Server¶
出力¶
CustomerID |
CustomerName |
数量 |
価格 |
|---|---|---|---|
11 |
ジャック・グレイ |
6 |
29.99 |
18 |
クインシー・ブラウン |
6 |
15.99 |
20 |
サム・グリーン |
6 |
89.99 |
22 |
ウルスラ・レッド |
6 |
9.99 |
24 |
ウェンディ・ブラック |
6 |
49.99 |
Snowflake¶
出力¶
CustomerID |
CustomerName |
数量 |
価格 |
|---|---|---|---|
11 |
ジャック・グレイ |
6 |
29.99 |
18 |
クインシー・ブラウン |
6 |
15.99 |
20 |
サム・グリーン |
6 |
89.99 |
22 |
ウルスラ・レッド |
6 |
9.99 |
24 |
ウェンディ・ブラック |
6 |
49.99 |
ケース4: 単一の LEFT JOIN 更新¶
SQL Server¶
出力¶
OrderID |
CustomerID |
ProductID |
数量 |
OrderDate |
|---|---|---|---|---|
5 |
null |
5 |
7 |
2024-11-05 |
13 |
null |
13 |
13 |
2024-11-13 |
Snowflake¶
出力¶
OrderID |
CustomerID |
ProductID |
数量 |
OrderDate |
|---|---|---|---|---|
5 |
null |
5 |
7 |
2024-11-05 |
13 |
null |
13 |
13 |
2024-11-13 |
注釈
Snowflakeのこのアプローチでは、必要な行が更新されないため、機能しません。
UPDATE Orders O SET O.Quantity = 13 FROM Customers C WHERE O.CustomerID = C.CustomerIDAND C.CustomerIDIS NULL AND O.ProductID = 13;
ケース5: 複数の LEFT JOIN と RIGHT JOIN 更新¶
これはもっと複雑なパターンです。複数の LEFT JOINs を翻訳するには、以下のパターンを確認してください。
注釈
LEFT JOIN と RIGHT JOIN は、 FROM 句の順番に依存します。
SQL Server¶
出力¶
OrderID |
CustomerID |
ProductID |
数量 |
OrderDate |
|---|---|---|---|---|
3 |
3 |
3 |
3 |
2024-11-12 |
Snowflake¶
出力¶
OrderID |
CustomerID |
ProductID |
数量 |
OrderDate |
|---|---|---|---|---|
3 |
3 |
3 |
3 |
2024-11-12 |
ケース6: 混在する INNER JOIN と LEFT JOIN 更新¶
SQL Server¶
出力¶
CustomerID |
CustomerName |
数量 |
|---|---|---|
null |
null |
4 |
Snowflake¶
出力¶
CustomerID |
CustomerName |
数量 |
|---|---|---|
null |
null |
4 |
ケース7: 単一の RIGHT JOIN 更新¶
SQL Server¶
出力¶
OrderID |
CustomerID |
ProductID |
数量 |
CustomerName |
|---|---|---|---|---|
3 |
3 |
3 |
1000 |
アリス・ジョンソン |
Snowflake¶
出力¶
OrderID |
CustomerID |
ProductID |
数量 |
CustomerName |
|---|---|---|---|---|
3 |
3 |
3 |
1000 |
アリス・ジョンソン |
既知の問題¶
Snowflakeの
UPDATEではJOINsを直接使用することができないため、説明したパターンに合致しないケースが存在する可能性があります。
LEFT と RIGHT JOIN を含む UPDATE¶
JOINs を含む UPDATE ステートメントの翻訳仕様。
Applies to
SQL Server
Azure Synapse Analytics
警告
Snowflakeで部分的にサポートされています
説明¶
パターン UPDATE FROM は、他のテーブルのデータに基づいてデータを更新するために使用されます。この SQLServer ドキュメント では、単純なサンプルを提供しています。
ドキュメント にある以下の SQL Server構文を確認してください。
SQL Server構文¶
table_name: 更新するテーブルまたはビュー。SET: 列とその新しい値を指定します。SET句は、1つ以上の列に新しい値(または式)を割り当てます。FROM:1つ以上のソーステーブルを指定するために使用されます(_ join のように)_。これは、更新を実行するためのデータの出所を定義するのに役立ちます。WHERE: 条件に基づいて更新する行を指定します。この句がなければ、テーブルのすべての行が更新されます。OPTION (query_hint): クエリ最適化のためのヒントを指定します。
Snowflake構文¶
Snowflakeの構文は Snowflakeドキュメント でも確認できます。
注釈
Snowflakeは UPDATE 句の JOINs をサポートしていません。
必須パラメーター
_
target_table:_ 更新するテーブルを指定します。_
col_name:_ _target_table_ 内の列の名前を指定します。テーブル名は含めないでください。例えば、UPDATE t1 SET t1.col = 1は無効です。_
value:_ _col_name_ に設定する新しい値を指定します。
オプションのパラメーター
FROM``_additional_tables:_ 更新する行の選択や新しい値のセットに使用する1つ以上のテーブルを指定します。ターゲットテーブルを繰り返すと自己結合になることに注意してください。WHERE``_条件:_ 更新するターゲットテーブルの行を指定する式。デフォルト:値なし(ターゲットテーブルのすべての行が更新されます)
翻訳概要¶
文法の説明にあるように、 UPDATE 句内のJOINs については、そのままの同等のソリューションはありません。このため、このステートメントを変換するアプローチとして、論理的に必要なデータをテーブルに追加する列に演算子(+)を追加します。この演算子(+)は、 LEFT/RIGHT JOIN セクションでテーブルが参照されるケースに追加されます。
Notice that there are other languages that use this operator (+) and the position of the operator may determine the type of join. In this specific case in Snowflake, the position will not determine the join type but the association with the logically needed tables and columns will.
Even when there are other alternative as MERGE clause or the usages of a CTE; these alternatives tend to turn difficult to read when there are complex queries, and get extensive.
サンプルソースパターン¶
セットアップデータ¶
SQL Server¶
Snowflake¶
LEFT JOIN¶
SQL Server¶
クエリ前の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
クエリ後の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
X1 |
Description1 |
2 |
A2 |
B2 |
C2 |
X2 |
Description2 |
3 |
A3 |
B3 |
C3 |
X3 |
Description3 |
Snowflake¶
クエリ前の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
クエリ後の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
X1 |
Description1 |
2 |
A2 |
B2 |
C2 |
X2 |
Description2 |
3 |
A3 |
B3 |
C3 |
X3 |
Description3 |
RIGHT JOIN¶
SQL Server¶
クエリ前の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
クエリ後の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
**X1 |
null |
2 |
A2 |
B2 |
C2 |
**X2 |
null |
3 |
A3 |
B3 |
C3 |
**X3 |
null |
Snowflake¶
クエリ前の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
クエリ後の出力¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
**X1 |
null |
2 |
A2 |
B2 |
C2 |
**X2 |
null |
3 |
A3 |
B3 |
C3 |
**X3 |
null |
既知の問題¶
ロジックの違いから翻訳できないパターンもあるかもしれません。
クエリパターンが当てはまる場合は、非決定行を見直してください。「FROM 句で、テーブル間に JOIN が含まれている場合(例:
t1とt2)、t1のターゲット行は、テーブルt2の複数の行を結合(つまり一致)する場合があります。これが発生すると、ターゲット行は 複数結合行 と呼ばれます。複数結合行を更新する場合、 ERROR_ON_NONDETERMINISTIC_UPDATE セッションパラメーターが更新の結果を制御します」 (Snowflakeドキュメント)。