【问题标题】:Subquery returned more than 1 value. Using merge and tsql子查询返回超过 1 个值。使用合并和 sql
【发布时间】:2016-08-30 14:08:52
【问题描述】:

目前我有一个使用游标的大存储过程,里面有两个合并语句。简而言之,我想从一张大桌子中填充两张桌子。

现在,我对 sql 很陌生,并且已经阅读了相当多的内容来扩展我的知识。在这项研究中,我遇到了许多主题,他们讨论了游标以及它们可能给出的性能问题。

当前的 SP(带光标)工作正常,但我一直在尝试使用不带光标的代码(其他 POV),这让我大吃一惊。

所以现在我被这段垃圾代码卡住了。我认为不可能按照我想要的方式去做,但是嘿,我可以试试。

错误:子查询返回超过 1 个值。当子查询跟随 =, !=, 时,这是不允许的

代码:

MERGE CONTACTS as target
USING STAGING_CONTACTS as source
ON (target.ID = source.ID)
WHEN MATCHED THEN
    UPDATE SET
        MAIL = (SELECT MAIL FROM STAGING_CONTACTS),
        NAME = (SELECT NAME FROM STAGING_CONTACTS),
        BRAND = (SELECT BRAND FROM STAGING_CONTACTS),
        ID = (SELECT ID FROM STAGING_CONTACTS)
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID)
    VALUES ((SELECT MAIL FROM STAGING_CONTACTS),
        (SELECT NAME FROM STAGING_CONTACTS),
        (SELECT BRAND FROM STAGING_CONTACTS),
        (SELECT ID FROM STAGING_CONTACTS));

这是我拥有的两个合并语句之一,这是较小的一个。

欢迎任何反馈!

提前致谢:)

【问题讨论】:

  • Merge 是一个有缺陷的实现,当有潜在的数据问题时很难调试。我绝不会允许任何人在我们的生产数据库中使用它。最好使用更新语句后跟插入(顺序很重要)

标签: sql sql-server tsql merge


【解决方案1】:

删除选择语句..下面的语句负责使用哪个表来更新哪个表..

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....)

【讨论】:

    【解决方案2】:

    使用下面的脚本..

    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 );
    

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 2013-04-05
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      相关资源
      最近更新 更多