SQL Server:存在时更新,不存在时插入

问题描述

我有两张桌子,一张叫 INTER 而另一个叫做 COM 他们之间的关系是1:many 这是两个表的结构

INTER

NUMBER
ADDRESS

COM

NUMBER
CONTACT
REFERENCE

提供有关表格的一些背景信息:

ADDRESS 表中的 INTER 字段可以为(空字符串 '')

CONTACT 表的 COM 字段可以有两种类型:“电子邮件”或“网站”

我想要完成的是以下内容

我想查看 COM where CONTACT='Website' 中的所有记录并将 COM 的值插入到 (INTER.NUMBER,'Website',INTER.ADDRESS) 其中 INTER.ADDRESS'' 和 INTER.NUMBER COM.NUMBER

中不存在

否则,我想更新 COM.REFERENCE 的值,将其设置为 INTER.ADDRESS,其中 COM.CONTACT='Website'INTER.NUMBER 存在在 COM.NUMBERINTER.ADDRESS''

我怎样才能做到这一点?我知道合并语句是什么,但根据文档合并在过滤查询上不能很好地工作。另外,我知道exists 语句,但我不知道如何使这个查询工作。

不幸的是,如果您想知道,这些表的结构无法修改

一些示例数据:

INTER

ABCD123,google.com
XUEH342,facebook.com
IISI521,twitter.com
IEIEK885,''

COM

ABCD123,Website,test.com
ABCD123,E-mail,[email protected]
XUEH342,facebook.com
XASE456,stackoverflow.com
XASE456,[email protected]

运行查询后,COM 表上的结果如下所示:

ABCD123,google.com
ABCD123,twitter.com
XASE456,[email protected]

如您所见,IISI521,twitter.com 已插入,ABCD123,test.com 已更新,IEEIK885,'' 未插入,因为是空字符串。

解决方法

    You can try below query:
        
    MERGE com with (HOLDLOCK) AS cm
USING (SELECT a.number,a.address,b.contact FROM inter a left join com b on a.number = b.number and b.contact = 'website'  WHERE a.address != '' ) AS intr
ON cm.number = intr.number and cm.contact = intr.contact
WHEN MATCHED  THEN
    UPDATE
            SET     cm.reference = intr.address
                    
WHEN NOT MATCHED THEN
    INSERT
      (
            number,contact,reference
      )
    VALUES
      (
            intr.number,'website',intr.address
      );