问题描述
我正在尝试使用 MERGE 将新值插入到表中,前提是它们不存在于同一个表中。
这是我正在使用的查询:
MERGE [dbo].[TARGET_TABLE] AS Target
USING
(SELECT [NAME]
FROM [dbo].[TARGET_TABLE]
WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source
ON Target.[NAME]= Source.[NAME]
WHEN NOT MATCHED
THEN INSERT ([NAME],[file_first_upload],[upload_date])
VALUES('ThisValuesDoesntExists',1,DEFAULT);
但是当我执行它时,我收到一条(0 行受影响)消息。
如果我执行“源”查询,我得到 0 行。
SELECT [NAME]
FROM [dbo].[TARGET_TABLE]
WHERE [NAME] = 'ThisValuesDoesntExists' AND [STATUS] IS NULL
我做错了什么?
谢谢
解决方法
如果您查看 MERGE 文档,您将看到源数据必须存在才能与目标表中的现有行匹配(或不匹配):
当不匹配 [按目标] 那么
指定每行插入一行到 target_table
您面临的问题是您的“源”数据没有返回任何内容,因此 MERGE 查询无法匹配或插入任何内容。
以下示例代码用于演示:
IF OBJECT_ID('dbo.TARGET_TABLE','U') IS NOT NULL DROP TABLE dbo.TARGET_TABLE
GO
CREATE TABLE TARGET_TABLE ([Name] VARCHAR(100),file_first_upload BIT,upload_date DATETIME,[STATUS] VARCHAR(100))
MERGE [dbo].[TARGET_TABLE] AS Target
USING
(SELECT [NAME]
FROM [dbo].[TARGET_TABLE]
WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source
ON Target.[NAME]= Source.[NAME]
WHEN NOT MATCHED
THEN INSERT ([NAME],[file_first_upload],[upload_date])
VALUES('ThisValuesDoesntExists',1,DEFAULT);
SELECT *
FROM TARGET_TABLE
MERGE [dbo].[TARGET_TABLE] AS Target
USING (VALUES ('ThisValuesDoesntExistss',GETDATE())) AS Source ([Name],[upload_date])
ON Target.[NAME] = Source.[Name]
WHEN NOT MATCHED
THEN INSERT ([NAME],[upload_date]) VALUES (Source.[Name],Source.file_First_upload,Source.upload_date);
SELECT *
FROM TARGET_TABLE