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

Ick*_*ter 10 sql upsert sybase-ase

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

有什么建议?

小智 6

ASE 15.7具有此功能.


Per*_*DBA 5

Sybase和DB2符合IEC/ISO/ANSI SQL Standrd标准.MS少一点.

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

因此,对您来说最好的建议是学习SQL标准方式,以便在Oracle方面做任何事情.第二个(不是第一个)了解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 )
Run Code Online (Sandbox Code Playgroud)

更新只是补充:

UPDATE target SET ( target_column = source_column, ... )
    FROM source
    WHERE primary_key IN ( SELECT primary_key FROM target )
Run Code Online (Sandbox Code Playgroud)

在UPDATE中很容易合并WHERE条件并消除子查询(我向你展示了解释).

据我了解,Oracle在执行子查询(标准SQL)方面非常不可靠.这就是他们拥有所有这些非标准"MERGE"等的原因,其目的是避免使用标准子查询语法,其他每个DBMS都可以轻松执行.


小智 5

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


Ste*_*tef 0

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

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