【问题标题】:SQL Server 2008 Merge Statement to check and insert if a record doesnt existSQL Server 2008 合并语句检查并插入记录是否不存在
【发布时间】:2012-05-14 11:37:06
【问题描述】:

我正在尝试通过 sql 脚本检查是否存在记录的某些条件来将记录添加到表中。我正在尝试使用合并语句。它不工作无法找出我哪里出错了。有人可以帮我弄这个吗?。谢谢

MERGE Categories As target
    USING (
    SELECT CategoryKey 
    From Categories where CategoryName = 'TestName'
    ) AS source on (source.CategoryKey = target.CategoryKey)
WHEN Not Matched THEN
    INSERT VALUES ('TestName');

【问题讨论】:

    标签: sql-server merge


    【解决方案1】:

    这样就可以了:

    MERGE Categories As target
    USING (SELECT 'TestName' AS CategoryName) AS source 
        ON (source.CategoryName = target.CategoryName)
    WHEN NOT MATCHED THEN
        INSERT (CategoryName) VALUES ('TestName');
    

    【讨论】:

    • 非常感谢 AdaTheDev!真的很有帮助
    【解决方案2】:

    您到底想完成什么?

    我问是因为您使用相同的表作为目标和源,并且由于您正在比较 CategoryKey,我假设它是主键,WHEN Not Matched 条件将永远不会被评估,因为如果您有一个表ID 1、2 和 3 并在 ID=ID 的情况下与自身进行比较,所有行都将评估为真。

    尝试将 WHEN Not Matched THEN 更改为 WHEN Matched then UPDATE 并编写一个简单的测试更新 sop 你可以看到我正在谈论的行为

    编辑 试试这个(假设你的 ID 是自动递增的)

    MERGE Categories As target
        USING (
        SELECT CategoryKey 
        From Categories where CategoryName = 'TestName'
        ) AS source on (source.CategoryName = target.CategoryName)
    WHEN Not Matched THEN
        INSERT VALUES ('TestName');
    

    【讨论】:

    • 感谢迭戈的回复。但我不想更新记录,我需要做的就是检查 CategoryName 为“TestName”的记录是否存在。如果存在什么都不做,否则我想添加一条记录。
    • 再次阅读我的答案。我说运行更新只是为了让您了解发生了什么。您编写查询的方式永远不会得到“WHEN Not Matched”
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2021-08-18
    • 2011-10-01
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多