1
我正在移動我的第一步與Sql Server數據庫項目,我正在尋找一種方法來填充後部署腳本中的引用表,而無需每次刪除和重新填充它們。經過一番研究,我偶然發現了這個博客條目:這是在Oracle數據庫中使用MERGE的唯一方法嗎?
,基本上描述了這個例子中,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有任何可用的語法快捷方式嗎?
是的,這是唯一的方法。 Oracle不支持'values()'行構造函數(除了**單行**'insert'語句)。對於您正在使用的不支持的版本10而言,這是正確的,但不幸的是,對於Oracle 12而言仍然如此。解決方法是使用常規的'insert'語句,並啓用錯誤日誌記錄https://docs.oracle.com/database/ 121/SQLRF/statements_9014.htm#SQLRF55104(但仍不會刪除過時的行) –