2010-12-21 19 views
9

Estoy escribiendo una aplicación para mover datos de Oracle a Sybase y necesito realizar operaciones de actualización/inserción. En Oracle, usaría MERGE INTO, pero no parece estar disponible en Sybase (no en ASE, de todos modos). Sé que esto se puede hacer con múltiples declaraciones, pero por un par de razones, realmente estoy tratando de incluir esto en una sola declaración.¿Upsert (actualizar o insertar) en Sybase ASE?

¿Alguna sugerencia?

Respuesta

0

Puede intentar falsificarlo con INSERT INTO y/o UPDATE FROM con algunas subconsultas, pero no será tan conveniente como lo hace Oracle.

¿Quieres hacer esto en el código o almacén de datos? porque también podría encapsular todo el SQL en un procedimiento almacenado si desea ocultar la complejidad de las consultas.

5

Sybase y DB2 son muy IEC/ISO/ANSI SQL Stand-comp. MS un poco menos.

Oracle no es muy compatible con el estándar (a pesar de lo que dicen los títulos). Más importante, debido a sus limitaciones, el método que utilizan para superarlos es introducir Extensiones a SQL (que no son necesarias para los demás DBMS, que no tienen las limitaciones). Una buena manera de asegurarse de que los clientes no migren.

Así que el mejor consejo para usted es aprender la forma de SQL Standard de hacer lo que sea que estuviera haciendo en el lado de Oracle. Y segundo (no primero) aprenda acerca de las extensiones de Sybase o DB2 (o lo que sea).

"MERGE" y "UPSERT" no existen en SQL, existen solo en Oracle. La conclusión es que tienes que ACTUALIZAR e INSERTAR en dos operaciones separadas.

En SQL, UPDATE e INSERT se aplican a una sola tabla; puede tener cláusulas FROM bastante complejas.

Por "Combinar", esto es simplemente una:

INSERT target (column_list) -- we do have defaults 
SELECT (column_list) 
    FROM source 
    WHERE primary_key NOT IN (SELECT primary_key FROM target) 

actualización es simplemente el complemento:

UPDATE target SET (target_column = source_column, ...) 
    FROM source 
    WHERE primary_key IN (SELECT primary_key FROM target) 

En la actualización es fácil de fusionar las condiciones dónde y eliminar la subconsulta (Te lo estoy mostrando para una explicación).

Según tengo entendido, Oracle es abismal en la ejecución de subconsultas (SQL estándar). Por eso tienen todas estas "MERGE" no estándar, etc., cuyo propósito es evitar la sintaxis de la subconsulta estándar, que cualquier otro DBMS realiza con facilidad.

+0

Gracias, pero como indiqué en la pregunta, soy consciente de cómo hacer esto con instrucciones individuales de Insertar y Actualizar. También estoy al tanto de ANSI SQL. En general, buscaba sugerencias sobre métodos o extensiones de las que no tenía conocimiento para llevar a cabo el proceso en un solo paso. No soy un gran admirador de Oracle, pero he encontrado que la declaración MERGE es una herramienta simple y elegante en varias situaciones. – Ickster

+1

@Ickster. Ok, pero la pregunta es por "declaración única".He proporcionado el único "método". Funciona para set-processing (múltiples filas). El único otro "método" es escribirlo como un proceso almacenado, pero eso lo degradará al procesamiento de filas (muy lento). – PerformanceDBA

4

Desafortunadamente, es imposible insertar y actualizar una tabla en una declaración sin utilizar MERGE. que por cierto existe en SQL a partir de SQL: 2008, de acuerdo con este article de todos modos, y es compatible con casi todas las bases de datos importantes, excepto Sybase ASE y PostgreSQL.

4

ASE 15.7 tiene esta característica.

+0

¿Tiene al menos un enlace al manual donde está documentado? –

+0

http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36272.1570/html/commands/commands84.htm – mosheb

Cuestiones relacionadas