这是在 Oracle 数据库中使用 MERGE 的唯一方法吗?
Is this the only way to use MERGE in Oracle database?
我的第一步是 Sql 服务器数据库项目,我正在寻找一种方法来填充 post 部署脚本中的引用表,而无需每次都删除和重新填充它们。经过一些研究,我偶然发现了这个博客条目:
基本上用这个例子描述了 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)
除了不完全等同(不删除不在源中的行)之外,我发现语法特别笨拙。
是否有适用于 Oracle 的任何语法快捷方式SQL?
我没有看到任何捷径,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
子句中提到的列。
我的第一步是 Sql 服务器数据库项目,我正在寻找一种方法来填充 post 部署脚本中的引用表,而无需每次都删除和重新填充它们。经过一些研究,我偶然发现了这个博客条目:
基本上用这个例子描述了 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)
除了不完全等同(不删除不在源中的行)之外,我发现语法特别笨拙。
是否有适用于 Oracle 的任何语法快捷方式SQL?
我没有看到任何捷径,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
子句中提到的列。