Ответ 1
ASE 15.7 имеет эту функцию.
Найдите документы здесь:http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36272.1570/html/commands/commands84.htm
Я пишу приложение для переноса данных из Oracle в Sybase и должен выполнять операции обновления/вставки. В Oracle я бы использовал MERGE INTO, но, похоже, он не доступен в Sybase (не в ASE, так или иначе). Я знаю, что это можно сделать с помощью нескольких операторов, но по нескольким причинам я действительно пытаюсь сделать это в одном заявлении.
Любые предложения?
ASE 15.7 имеет эту функцию.
Найдите документы здесь:http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36272.1570/html/commands/commands84.htm
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" и т.д., Целью которых является избежание синтаксиса стандартного подзапроса, который легко выполняет любая другая СУБД.
к сожалению, невозможно вставить и обновить таблицу в одном операторе без использования MERGE. что, кстати, существует в SQL, начиная с SQL: 2008, согласно этой статье, и поддерживается почти всеми основными базами данных, кроме Sybase ASE и PostgreSQL.
Может быть, это может сработать. Протестировано в ASA9.
insert into my_table (columns) on existing update values (values);
Может быть, вы можете попытаться подделать его с INSERT INTO и/или UPDATE FROM с некоторыми подзапросами, но это будет не так удобно, как это делает Oracle.
Вы хотите сделать это в коде или хранилище данных? потому что вы также можете инкапсулировать весь SQL в хранимую процедуру, если хотите скрыть сложность запросов.
Слияние существует в SAP ASE 15.7 и выше, как упомянуто здесь и здесь
Replace/Upsert существует в SAP ASE 16.0 и выше.
Вам нужно будет обновить доступ к ним.