【问题标题】:MERGE statement is not updatingMERGE 语句未更新
【发布时间】:2013-08-29 14:37:51
【问题描述】:

在 SQL Server 上执行以下操作时,我希望 NULL 被更新为 88888888 值,但它会插入一个新行。 谁能告诉我我做错了什么?

USE tempdb;

CREATE TABLE TableA (ColA CHAR(8), ColB CHAR(8))
CREATE TABLE TableB (ColA CHAR(8), ColB CHAR(8))

INSERT INTO TableA VALUES  ( 'XXXXXXXX', NULL )
INSERT INTO TableA VALUES  ( 'XXXXXXXX', '88888888')

MERGE INTO TableB AS T
USING TableA AS S
ON T.ColA = S.ColA and T.ColB = S.ColB
WHEN MATCHED 
    THEN
      UPDATE
         SET T.ColA = S.ColA, T.ColB = S.ColB
WHEN NOT MATCHED BY TARGET 
    THEN
      INSERT (ColA, ColB) VALUES (S.ColA, S.ColB);

SELECT  * FROM    TableA
SELECT  * FROM    TableB

DROP TABLE TableA
DROP TABLE TableB

非常感谢! 此致, 史蒂夫

【问题讨论】:

    标签: sql sql-server tsql merge


    【解决方案1】:

    a) 表格本质上是无序的。即使(如您所料)合并一次只进行一行(参见下面的c),也没有理由在空ColB 的行之前看不到两列都非空的行

    b) 您的ON 子句指定了ColAColB 的匹配项。这两行至少在其中一个中是不同的,所以我希望这两行都不匹配TableB 中的一行,并且

    c) SQL 语句的应用就像所有行同时受到影响一样。它不处理一行,然后移动到下一行。因此,TableB 中永远不会只有一行。

    不幸的是,您发布的内容显然是一个“玩具”示例,因此我无法就如何修复它提供任何建议 - 您没有告诉我们真实情况是什么,真实数据是什么样的,为什么你使用MERGE

    【讨论】:

    • Damien_The_Unbeliever,您的评论是正确的。看起来我正在尝试做一些使用 merge 语句不可能做的事情。看来我需要一个游标(...)。谢谢提示!!
    【解决方案2】:
    MERGE INTO TableB AS T
    USING TableA AS S
    ON T.ColA = S.ColA 
    WHEN MATCHED 
    THEN
      UPDATE
         SET  T.ColB = S.ColB
    

    请将此从加入中删除:和 T.ColB = S.ColB

    您还可以从更新中删除 T.ColA = S.ColA,因为这些列已经具有相同的值。

    【讨论】:

    • 嗨,Sonam,你是对的,这些可以删除,但结果保持不变。谢谢!
    猜你喜欢
    • 2013-01-26
    • 2021-01-06
    • 2021-04-29
    • 2013-06-11
    • 1970-01-01
    • 2022-10-13
    • 2018-08-05
    • 2018-03-11
    • 2022-12-03
    相关资源
    最近更新 更多