【问题标题】:Merge Into with no rows合并到没有行
【发布时间】:2015-09-05 10:26:50
【问题描述】:

有没有办法使用指令:

MERGE INTO MySchema.MyTable AS Target
USING (VALUES
........
)

除了点之外什么都没有?通常你有一个类似(firstValue,SecondValue,...,LastValue)的列表,你想要合并的每一行都有一个,但我希望能够编写没有行的指令,以便删除部分MERGE 删除所有行。

这是因为我使用的存储过程会自动创建 MERGE 指令,但有时我开始的表是空的。

当然我试过了:

MERGE INTO MySchema.MyTable AS Target USING (VALUES) 

但它不被接受。

例子:

MERGE INTO [dbo].[MyTable] AS Target
USING (VALUES (1,'Attivo') ,(2,'Disabilitato') ,(3,'Bloccato') ) AS Source ([IDMyField],[MyField]) ON (Target.[IDMyField] = Source.[IDMyField])
WHEN MATCHED AND ( NULLIF(Source.[MyField], Target.[MyField]) IS NOT NULL OR NULLIF(Target.[MyField], Source.[MyField]) IS NOT NULL)
THEN UPDATE SET [MyField] = Source.[MyField]
WHEN NOT MATCHED BY TARGET
THEN INSERT([IDMyField],[MyField]) VALUES(Source.[IDMyField],Source.[MyField]) 
WHEN NOT MATCHED BY SOURCE
THEN DELETE; 

【问题讨论】:

  • 请发布您正在使用的整个 MERGE 语句的实例 is 工作,即 USING 子句有一些值。 (我之所以问,是因为我在 MERGE 文档中没有看到任何允许在 USING 子句中使用关键字 VALUES 的内容。)
  • 如果你只是想删除为什么不使用删除语句?
  • 合并到 [dbo].[MyTable] 作为目标使用 (VALUES (1,'Attivo') ,(2,'Disabilitato') ,(3,'Bloccato') ) 作为源 ([ IDMyField],[MyField]) ON (Target.[IDMyField] = Source.[IDMyField]) WHEN MATCHED AND ( NULLIF(Source.[MyField], Target.[MyField]) 不为 NULL 或 NULLIF(Target.[MyField] , Source.[MyField]) IS NOT NULL) THEN UPDATE SET [MyField] = Source.[MyField] WHEN NOT MATCHED BY TARGET THEN INSERT([IDMyField],[MyField]) VALUES(Source.[IDMyField],Source.[ MyField]) 当源不匹配时删除;
  • 很抱歉,即使使用最后两个空格作为 ,我也无法添加换行符,就像帮助中所述...
  • @SeanLange:当然我不“只是”想删除,否则是的,我会使用 DELETE。你的评论就像“如果你想用轮子移动,为什么不使用自行车而不是飞机?” -> 因为我也想飞,自行车是带轮子的,但一般来说,不允许我飞。我需要的是一个完整的 MERGE,它还可以处理源表没有行并且我需要目标表没有行但我也希望能够更新和插入的情况:这就是 MERGE 应该是什么用于。

标签: sql-server tsql merge


【解决方案1】:

如果您正在生成内部查询,并且外部查询与预定义的 ID 字段匹配,则以下操作将起作用:

MERGE INTO tester AS Target
USING (

select null as test1 --generate select null, alias as your id field
) as SOURCE on target.test1 = source.test1
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE;

针对您的特殊情况:

MERGE INTO table1 AS Target
USING (

values(null)
) as SOURCE(id) on target.id = source.id
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE;

【讨论】:

  • ops...等等...它似乎适用于只有一个可为空列的简单表。但是当我用普通表尝试它时,它似乎不起作用,因为表的 PK 当然不能为空。我错了吗?
  • 经过多次尝试并感谢您的第一个答案,我认为可行的解决方案类似于:USING (SELECT * FROM MyTable WHERE 1 = 0)
  • @JohannesWentu 您应该将其添加为单独的答案,因为它比这里的两个建议更好。
【解决方案2】:

一个可行的解决方案是:

USING (SELECT * FROM MyTable WHERE 1 = 0) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多