Ick*_*ter 10 sql upsert sybase-ase
我正在编写一个应用程序来将数据从Oracle移动到Sybase,并且需要执行更新/插入操作.在Oracle中,我使用MERGE INTO,但它似乎在Sybase中不可用(无论如何都不在ASE中).我知道这可以用多个语句完成,但由于几个原因,我真的想把它变成一个语句.
有什么建议?
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都可以轻松执行.
也许您可以尝试使用 INSERT INTO 和/或 UPDATE FROM 以及一些子查询来伪造它,但它不会像 Oracle 那样方便。
您想将其写入代码或数据仓库吗?因为如果您想隐藏查询的复杂性,您还可以将所有 SQL 封装到存储过程中。
| 归档时间: |
|
| 查看次数: |
14556 次 |
| 最近记录: |