在Sybase ASE中进行升级(更新或插入)?

时间:2010-12-21 22:02:36

标签: sql sybase-ase upsert

我正在编写一个应用程序,用于将数据从Oracle移动到Sybase,并且需要执行更新/插入操作。在Oracle中,我使用MERGE INTO,但它似乎在Sybase中不可用(不管是在ASE中)。我知道这可以用多个语句完成,但由于几个原因,我真的想把它变成一个语句。

有什么建议吗?

6 个答案:

答案 0 :(得分:6)

ASE 15.7具有此功能。

答案 1 :(得分:5)

Sybase和DB2非常符合IEC / ISO / ANSI SQL Standrd标准。 MS稍差一点。

Oracle完全不符合标准(尽管有光泽的说法)。更重要的是,由于它的局限性,他们用来克服它们的方法是引入SQL扩展(其他DBMS不需要它,没有这些限制)。确保客户不会迁移的好方法。

因此,最好的建议是学习SQL标准方式,以便在Oracle方面做任何事情。第二个(不是第一个)了解Sybases或DB2(或其他)扩展。

SQL中不存在“MERGE”和“UPSERT”,它们仅存在于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在执行子查询(标准SQL)时非常小心。这就是为什么他们拥有所有这些非标准的“MERGE”等,其目的是避免使用标准子查询语法,其他所有DBMS都可以轻松执行。

答案 2 :(得分:5)

遗憾的是,如果不使用MERGE,则无法在一个语句中插入和更新表。从SQL {2008开始,SQL中确实存在btw,根据这个article,并且几乎所有主要数据库都支持它,除了Sybase ASE和PostgreSQL。

答案 3 :(得分:1)

也许它可以奏效。在ASA9中测试过。

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

答案 4 :(得分:0)

可能您可以尝试使用INSERT INTO和/或UPDATE FROM使用一些子查询来伪造它,但它不会像Oracle那样方便。

您想将其转换为代码或数据仓库吗?因为如果要隐藏查询的复杂性,也可以将所有SQL封装到存储过程中。

答案 5 :(得分:0)

SAP herehere中提到,SAP ASE 15.7中存在合并。

SAP ASE 16.0 and up中存在替换/ Upsert。

您需要更新才能访问它们。