问题描述
我有两张桌子,一张叫
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.NUMBER
和 INTER.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
);