2015-11-06 46 views
1

我正在移動我的第一步與Sql Server數據庫項目,我正在尋找一種方法來填充後部署腳本中的引用表,而無需每次刪除和重新填充它們。經過一番研究,我偶然發現了這個博客條目:這是在Oracle數據庫中使用MERGE的唯一方法嗎?

http://blogs.msdn.com/b/ssdt/archive/2012/02/02/including-data-in-an-sql-server-database-project.aspx

,基本上描述了這個例子中,MERGE語句的行爲:

-- Reference Data for AddressType 
MERGE INTO AddressType AS Target 
USING (VALUES 
    (0, N'Undefined'), 
    (1, N'Billing'), 
    (2, N'Home'), 
    (3, N'Main Office'), 
    (4, N'Primary'), 
    (5, N'Shipping'), 
    (6, N'Archive') 
) 
AS Source (AddressTypeID, Name) 
ON Target.AddressTypeID = Source.AddressTypeID 
-- update matched rows 
WHEN MATCHED THEN 
UPDATE SET Name = Source.Name 
-- insert new rows 
WHEN NOT MATCHED BY TARGET THEN 
INSERT (AddressTypeID, Name) 
VALUES (AddressTypeID, Name) 
-- delete rows that are in the target but not the source 
WHEN NOT MATCHED BY SOURCE THEN 
DELETE 

自從我與Oracle數據庫也工作,我已經試過使之前的示例適應Oracle 10g語法,並且我生成了類似如下的內容:

-- Reference Data for AddressType 
MERGE INTO AddressType AS T 
USING (WITH CTE AS (
    SELECT 0 AS AddressTypeID, 'Undefined' AS Name FROM DUAL 
    UNION 
    SELECT 1 AS AddressTypeID, 'Billing' AS Name FROM DUAL 
    UNION 
    SELECT 2 AS AddressTypeID, 'Home' AS Name FROM DUAL 
    UNION 
    SELECT 3 AS AddressTypeID, 'Main Office' AS Name FROM DUAL 
    UNION 
    SELECT 4 AS AddressTypeID, 'Primary' AS Name FROM DUAL 
    UNION 
    SELECT 5 AS AddressTypeID, 'Shipping' AS Name FROM DUAL 
    UNION 
    SELECT 6 AS AddressTypeID, 'Archive'AS Name FROM DUAL 
) 
SELECT AddressTypeID, Name FROM CTE 
) 
AS S 
ON T.AddressTypeID = S.AddressTypeID 
-- update matched rows 
WHEN MATCHED THEN 
UPDATE SET T.Name = S.Name 
-- insert new rows 
WHEN NOT MATCHED 
INSERT (T.AddressTypeID, T.Name) 
VALUES (S.AddressTypeID, S.Name) 

除了不完美y等效(不刪除不在源代碼中的行)我發現語法特別尷尬。

Oracle SQL有任何可用的語法快捷方式嗎?

+2

是的,這是唯一的方法。 Oracle不支持'values()'行構造函數(除了**單行**'insert'語句)。對於您正在使用的不支持的版本10而言,這是正確的,但不幸的是,對於Oracle 12而言仍然如此。解決方法是使用常規的'insert'語句,並啓用錯誤日誌記錄https://docs.oracle.com/database/ 121/SQLRF/statements_9014.htm#SQLRF55104(但仍不會刪除過時的行) –

回答

2

我沒有看到任何快捷方式,的語法MERGE就是您隨身攜帶的。

您可以刪除的唯一東西是WITH子句USING子句中的CTE。你可以簡單地把它作爲:

-- Reference Data for AddressType 
MERGE INTO AddressType AS T 
USING (
    SELECT 0 AS AddressTypeID, 'Undefined' AS Name FROM DUAL 
    UNION 
    SELECT 1 AS AddressTypeID, 'Billing' AS Name FROM DUAL 
    UNION 
    SELECT 2 AS AddressTypeID, 'Home' AS Name FROM DUAL 
    UNION 
    SELECT 3 AS AddressTypeID, 'Main Office' AS Name FROM DUAL 
    UNION 
    SELECT 4 AS AddressTypeID, 'Primary' AS Name FROM DUAL 
    UNION 
    SELECT 5 AS AddressTypeID, 'Shipping' AS Name FROM DUAL 
    UNION 
    SELECT 6 AS AddressTypeID, 'Archive'AS NAME FROM DUAL 
    ) AS S 
ON T.AddressTypeID = S.AddressTypeID 
-- update matched rows 
WHEN MATCHED THEN 
UPDATE SET T.Name = S.Name 
-- insert new rows 
WHEN NOT MATCHED 
INSERT (T.AddressTypeID, T.Name) 
VALUES (S.AddressTypeID, S.Name) 

,當然,你不能更新ON條款中提到的列。

相關問題