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