2010-12-21 51 views
9

我正在編寫一個應用程序來將數據從Oracle移動到Sybase,並需要執行更新/插入操作。在Oracle中,我使用MERGE INTO,但似乎無法在Sybase中使用(不在ASE中)。我知道這可以用多個語句來完成,但出於幾個原因,我真的試圖將它歸入單個語句。SybaseSE中的Upsert(更新或插入)?

有什麼建議嗎?

回答

0

也許你可以嘗試用INSERT INTO和/或UPDATE FROM來僞造它,但它不會像Oracle那樣方便。

你想在代碼或數據倉庫中做到這一點?因爲如果要隱藏查詢的複雜性,也可以將所有SQL封裝到存儲過程中。

5

Sybase和DB2非常符合IEC/ISO/ANSI SQL標準。 MS稍微少一些。

甲骨文並不是非常符合標準(儘管這些光標說的是什麼)。更重要的是,由於它的侷限性,它們用來克服它們的方法是引入SQL擴展(對於其他DBMS並不需要這些擴展),這些擴展並不具備這些限制)。確保客戶不會遷移的好方法。

因此,最好的建議是學習SQL標準方法來做任何你在Oracle方面做的事情。其次(不是第一次)瞭解Sybases或DB2(或其他)擴展。

「MERGE」和「UPSERT」在SQL中不存在,它們僅存在於Oracle中。底線是,你必須在兩個獨立的操作中更新和插入。

在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) 

在更新,很容易合併WHERE條件和消除子查詢(我向你展示了它的解釋)。

據我所知,Oracle在執行子查詢(標準SQL)方面存在深層次的問題。這就是爲什麼他們有所有這些非標準的「MERGE」等,其目的是爲了避免標準子查詢語法,每個其他數據庫管理系統輕鬆執行。

+0

謝謝,但正如我在問題中指出的,我知道如何用單獨的插入和更新語句來做到這一點。我也知道ANSI SQL。我一般都在尋找關於方法或擴展的建議,而我並不知道這些方法或擴展可以通過一個步驟完成。 我不是Oracle的忠實粉絲,但我發現MERGE語句在幾種情況下是一個簡單而優雅的工具。 – Ickster 2011-01-19 22:34:06

+1

@Ickster。好的,但問題要求提供「單一聲明」。我提供了唯一的「方法」。它適用於設置處理(多行)。唯一的其他「方法」是將其寫入存儲過程,但會降級爲行處理(非常慢)。 – PerformanceDBA 2011-01-19 22:55:29

4

不幸的是,無法使用MERGE在一個語句中插入和更新表。根據這個article,它依然存在於從SQL:2008開始的SQL中,幾乎所有主要數據庫都支持它,但Sybase ASE和PostgreSQL除外。

4

ASE 15.7具有此功能。