子查询返回了多个值。使用merge和tsql
目前,我有一个使用游标的大型存储过程,其中有两个merge语句。简而言之,我想从一个大表填充两个表 现在,我对sql还是个新手,为了扩展我的知识,我读了不少书。在这项研究中,我遇到了许多话题,他们讨论了游标及其可能给出的性能问题 当前的SP(带游标)工作正常,但我一直试图在没有游标的情况下使用我的代码(其他POV),这让我非常恼火 所以现在我被这段垃圾代码困住了。我想这是不可能做到的方式,我想它,但嘿,我可以尝试的权利子查询返回了多个值。使用merge和tsql,sql,sql-server,tsql,merge,Sql,Sql Server,Tsql,Merge,目前,我有一个使用游标的大型存储过程,其中有两个merge语句。简而言之,我想从一个大表填充两个表 现在,我对sql还是个新手,为了扩展我的知识,我读了不少书。在这项研究中,我遇到了许多话题,他们讨论了游标及其可能给出的性能问题 当前的SP(带游标)工作正常,但我一直试图在没有游标的情况下使用我的代码(其他POV),这让我非常恼火 所以现在我被这段垃圾代码困住了。我想这是不可能做到的方式,我想它,但嘿,我可以尝试的权利 错误:子查询返回的值超过1。当子查询后跟=、!=、时,不允许这样做 删除se
错误:子查询返回的值超过1。当子查询后跟=、!=、时,不允许这样做 删除select语句..下面的语句负责使用哪个表更新哪个表
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
因此,您的查询可以如下所示
UPDATE SET
MAIL = MAIL ,
and so on...
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (mail,name,brand,id)
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
target.MAIL = source.MAIL,
and so on..
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (source.all columns....)
您还可以使用如下所示的别名
UPDATE SET
MAIL = MAIL ,
and so on...
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (mail,name,brand,id)
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
target.MAIL = source.MAIL,
and so on..
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (source.all columns....)
删除select语句..下面的语句负责使用哪个表更新哪个表
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
因此,您的查询可以如下所示
UPDATE SET
MAIL = MAIL ,
and so on...
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (mail,name,brand,id)
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
target.MAIL = source.MAIL,
and so on..
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (source.all columns....)
您还可以使用如下所示的别名
UPDATE SET
MAIL = MAIL ,
and so on...
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (mail,name,brand,id)
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
target.MAIL = source.MAIL,
and so on..
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES (source.all columns....)
使用下面的脚本
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
target.MAIL = source.MAIL ,
target.NAME = source.Name,
target.BRAND = source.BRAND ,
target.ID = source.ID
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES ( source.MAIL , source.Name, source.BRAND ,source.ID );
使用下面的脚本
MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
UPDATE SET
target.MAIL = source.MAIL ,
target.NAME = source.Name,
target.BRAND = source.BRAND ,
target.ID = source.ID
WHEN NOT MATCHED THEN
INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
VALUES ( source.MAIL , source.Name, source.BRAND ,source.ID );
合并是一个有缺陷的实现,并且在以后出现潜在数据问题时很难调试。我绝不允许任何人在我们的生产数据库中使用它。最好先使用update语句,然后再使用Insert(顺序很重要)。合并是一个有缺陷的实现,并且在以后出现潜在数据问题时很难调试。我绝不允许任何人在我们的生产数据库中使用它。最好先使用update语句,然后再使用Insert(顺序很重要)