OracleからSybaseにデータを移動するアプリケーションを作成しており、更新/挿入操作を実行する必要があります。OracleではMERGEINTOを使用しますが、Sybaseでは使用できないようです(とにかくASEでは使用できません)。これは複数のステートメントで実行できることは知っていますが、いくつかの理由から、これを1つのステートメントにまとめようとしています。
助言がありますか?
ASE 15.7 にはこの機能があります。
ここでドキュメントを見つけてください: http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36272.1570/html/commands/commands84.htm
Sybase と DB2 は、IEC/ISO/ANSI SQL 標準に非常に準拠しています。MSは少し少ないです。
オラクルは、標準にまったく準拠していません(用語集に記載されているにもかかわらず)。さらに重要なことは、制限があるため、それらを克服するために使用する方法は、SQL への拡張機能を導入することです (これは、制限のない他の DBMS には必要ありません)。顧客が離れないようにする良い方法です。
そのため、Oracle側で行っていたことをSQL標準で行う方法を学ぶことをお勧めします。そして 2 番目 (最初ではありません) は、Sybase や DB2 (またはその他の) 拡張機能について学びます。
「MERGE」と「UPSERT」は SQL には存在せず、Oracle にのみ存在します。つまり、UPDATE と INSERT を 2 つの別々の操作で実行する必要があります。
SQL では、UPDATE と INSERT は単一のテーブルに適用されます。FROM 句が非常に複雑な場合があります。
「MERGE」の場合、それは単に次のとおりです。
INSERT target ( column_list ) -- we do have defaults
SELECT ( column_list )
FROM source
WHERE primary_key NOT IN ( SELECT primary_key FROM target )
更新は単なる補足です。
UPDATE target SET ( target_column = source_column, ... )
FROM source
WHERE primary_key IN ( SELECT primary_key FROM target )
UPDATE では、WHERE 条件をマージしてサブクエリを削除するのは簡単です (説明のために示しています)。
私が理解しているように、Oracleはサブクエリ(標準SQL)の実行が苦手です。これが、これらすべての非標準の「MERGE」などがある理由です。その目的は、他のすべての DBMS が簡単に実行する標準のサブクエリ構文を回避することです。
残念ながら、MERGE を使用せずに 1 つのステートメントでテーブルを挿入および更新することはできません。どちらにしても、この記事によると、SQL:2008 の時点で SQL に存在し、Sybase ASE と PostgreSQL を除くほとんどすべての主要なデータベースでサポートされています。
INSERTINTOやUPDATEFROMを使用して、いくつかのサブクエリを使用して偽造を試みることもできますが、Oracleほど便利ではありません。
これをコードまたはデータウェアハウスに入れたいですか?クエリの複雑さを隠したい場合は、すべてのSQLをストアドプロシージャにカプセル化することもできるからです。