10

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

有什么建议么?

4

6 回答 6

6

ASE 15.7 具有此功能。

在此处查找文档:http: //infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36272.1570/html/commands/commands84.htm

于 2011-07-04T19:01:18.923 回答
5

不幸的是,如果不使用 MERGE,就不可能在一个语句中插入和更新表。顺便说一句,从 SQL:2008 开始,SQL 中确实存在,无论如何,根据这篇文章,并且几乎所有主要数据库都支持,除了 Sybase ASE 和 PostgreSQL。

于 2011-01-27T19:49:54.070 回答
5

Sybase 和 DB2 非常符合 IEC/ISO/ANSI SQL 标准。MS少了一点。

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

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

SQL 中不存在“MERGE”和“UPSERT”,它们仅存在于 Oracle 中。最重要的是,您必须在两个单独的操作中进行 UPDATE 和 INSERT。

在 SQL 中,UPDATE 和 INSERT 适用于单个表;你可能有相当复杂的 FROM 子句。

对于“合并”,这只是一个:

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)方面非常糟糕。这就是为什么他们拥有所有这些非标准的“合并”等,其目的是避免标准子查询语法,而其他所有 DBMS 都可以轻松执行这些语法。

于 2011-01-19T08:39:32.373 回答
1

合并存在于 SAP ASE 15.7 及更高版本中,如此此处所述

Replace / Upsert 存在于SAP ASE 16.0 及更高版本中。

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

于 2019-06-19T23:55:03.467 回答
1

也许它可以工作。在 ASA9 中测试。

insert into my_table (columns) on existing update values (values);
于 2018-06-08T13:32:47.977 回答
0

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

你想在代码或数据仓库中这样做吗?因为如果要隐藏查询的复杂性,还可以将所有 SQL 封装到存储过程中。

于 2010-12-26T11:48:39.677 回答