【问题标题】:SQL Server: Update where exists and Insert when not existsSQL Server:更新存在的地方,不存在的地方插入
【发布时间】:2021-09-16 07:37:01
【问题描述】:

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

INTER

NUMBER
ADDRESS

COM

NUMBER
CONTACT
REFERENCE

提供有关表格的一些上下文:

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

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

我想要完成的是:

我想查看来自COM 的所有记录,其中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 ''

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

如果您想知道,很遗憾,这些表的结构无法修改。

一些样本数据:

INTER

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

COM

ABCD123, Website, test.com
ABCD123,E-mail,bob@gmail.com
XUEH342,Website,facebook.com
XASE456,Website, stackoverflow.com
XASE456,E-mail,tom@gmail.com

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

ABCD123,Website, google.com
ABCD123,E-mail,bob@gmail.com
XUEH342,Website, facebook.com
IISI521,Website, twitter.com
XASE456,Website, stackoverflow.com
XASE456,E-mail,tom@gmail.com

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

【问题讨论】:

  • 样本数据和预期结果将帮助我们帮助您。以及您的次尝试。
  • 好的,让我更新一下问题

标签: sql-server merge exists not-exists


【解决方案1】:
    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
      );

【讨论】:

  • 您好@Pareshk,根据 MERGE 文档 在 on 语句中有一个注意事项: 注意 仅指定目标表中的列以用于匹配目的很重要。也就是说,指定目标表中与源表的对应列进行比较的列。不要试图通过在 ON 子句中过滤掉目标表中的行来提高查询性能;例如,例如指定 AND NOT target_table.column_x = value。这样做可能会返回意外和不正确的结果。这还能用吗?
  • 这里是 MERGE 文档的链接。 link
  • @PedroEmilioVélez,是的,你是对的。我的错。但是有一些解决方案可以通过修改 USING 子句中使用的派生表来为您提供所需的输出。我已经编辑了我的答案。
猜你喜欢
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多