我正在编写一个应用程序来将数据从Oracle移动到Sybase,并且需要执行更新/插入操作.在Oracle中,我会使用MERGE INTO,但在Sybase中似乎并不可用(反之亦然).我知道这可以用多个语句来完成,但是由于几个原因,我真的试图将它变成一个语句.
有什么建议么?
解决方法
Sybase和DB2非常符合IEC / ISO / ANSI sql标准. MS少一点.
甲骨文根本不符合标准规定(尽管有什么好声明).更重要的是,由于它的局限性,他们用来克服它们的方法是将扩展引入到sql(对于没有限制的其他DBMS来说,这不是必需的).确保客户不要迁移的好方法.
所以对你来说最好的建议是学习在Oracle方面做任何事情的sql Standard方法.第二个(不是第一个)了解Sybases或DB2(或其他)扩展.
sql中不存在“MERGE”和“UPSERT”,它们仅存在于Oracle中.底线是,您必须在两个单独的操作中进行UPDATE和INSERT.
在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”等,其目的是避免标准子查询语法,每个其他DBMS都能轻松执行.