Upsert (обновление или вставка) в Sybase ASE?

Я пишу приложение для переноса данных из Oracle в Sybase и должен выполнять операции обновления/вставки. В Oracle я бы использовал MERGE INTO, но, похоже, он не доступен в Sybase (не в ASE, так или иначе). Я знаю, что это можно сделать с помощью нескольких операторов, но по нескольким причинам я действительно пытаюсь сделать это в одном заявлении.

Любые предложения?

Ответ 2

Sybase и DB2 соответствуют требованиям стандарта IEC/ISO/ANSI SQL Standrd. MS немного меньше.

Oracle не совсем совместим со стандартом (несмотря на то, что говорят глянцевые). Более того, из-за ограничений, метод, который они используют для их преодоления, заключается в том, чтобы вводить Extensions в SQL (которые не требуются для других СУБД, которые не имеют ограничений). Хороший способ убедиться, что клиенты не уходят.

Поэтому лучшим советом для вас является изучение стандартного SQL-стандартного способа делать то, что вы делали на стороне Oracle. И второй (не первый) рассказ о расширениях Sybases или DB2s (или любых других).

"MERGE" и "UPSERT" не существуют в SQL, они существуют только в Oracle. Суть в том, что вы должны ОБНОВИТЬ и ВСТАВИТЬ в двух отдельных операциях.

В 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 является безумным при выполнении подзапросов (Standard SQL). Именно поэтому у них есть все эти нестандартные "MERGE" и т.д., Целью которых является избежание синтаксиса стандартного подзапроса, который легко выполняет любая другая СУБД.

Ответ 3

к сожалению, невозможно вставить и обновить таблицу в одном операторе без использования MERGE. что, кстати, существует в SQL, начиная с SQL: 2008, согласно этой статье, и поддерживается почти всеми основными базами данных, кроме Sybase ASE и PostgreSQL.

Ответ 4

Может быть, это может сработать. Протестировано в ASA9.

insert into my_table (columns) on existing update values (values);

Ответ 5

Может быть, вы можете попытаться подделать его с INSERT INTO и/или UPDATE FROM с некоторыми подзапросами, но это будет не так удобно, как это делает Oracle.

Вы хотите сделать это в коде или хранилище данных? потому что вы также можете инкапсулировать весь SQL в хранимую процедуру, если хотите скрыть сложность запросов.

Ответ 6

Слияние существует в SAP ASE 15.7 и выше, как упомянуто здесь и здесь

Replace/Upsert существует в SAP ASE 16.0 и выше.

Вам нужно будет обновить доступ к ним.