【问题标题】:Subquery returned more than 1 value. This is not permitted when the subquery follows ... when the subquery is used as an expression子查询返回超过 1 个值。当子查询跟在后面时,这是不允许的……当子查询用作表达式时
【发布时间】:2016-09-06 02:27:47
【问题描述】:

我查看了其他答案,但没有一个回答我做错了什么或者我不明白。

我正在尝试从另一个表更新一个表,但它们不共享一个共同的参考。第三个表确实与这两个表共享一个引用,所以我如何让它们相互引用以进行更新。这是我最好的尝试。

Update jobs

Set Phone = (Select coalesce([Work Phone], [Home Phone], [Cell Phone]) 
            from Contacts c  
                INNER JOIN Easement_Contacts e on c.CPID = e.Contact_ID)

Where Exists (Select Contact_ID 
              from Easement_Contacts e 
                  INNER JOIN Jobs j on j.Easement = e.Easement_ID)

【问题讨论】:

    标签: sql-server-2012 sql-update inner-join where exists


    【解决方案1】:

    我认为您正在寻找的是:

    UPDATE j
    SET Phone = coalesce(c.[Work Phone], c.[Home Phone], c.[Cell Phone])
    FROM jobs j
        JOIN Easement_Contacts e on j.Easement = e.Easement_ID
        JOIN Contacts c on e.Contact_ID = c.CPID
    

    我假设所有 3 个电话号码都来自您示例中的联系人表。您尝试使用的相关子查询未锚定到“作业”表,因为它不包含引用子查询范围之外的对象的联接或 where 子句。通过在 FROM 子句中引用您要更新的表,您可以连接所有表并设置 UPDATE 语句的上下文,方法是使用“jobs”别名作为顶部 UPDATE 语句的主题。

    【讨论】:

    • 感谢@Shnugo,您提出 m:n 关系是对的。我理所当然地认为模型已正确键入。但多行匹配可能会使更新不确定。
    • 感谢工作。我很想在 select 语句中保留 Contacts 表。
    • 为什么数据来自联系人而不是联系人?我假设 JOIN 顺序无关紧要,它与整个数据集有关。
    【解决方案2】:

    在不了解表格结构的情况下,这有点像在魔法玻璃灯泡中阅读。对于可更新的 CTE,这个问题可能是一个很好的例子。但请注意,对于 m:n-relation,同一行可能会以相当随机的值更新...

    我建议首先将 CTE 的SELECT 隔离(添加您需要控制输出的列并检查右侧的NewPhone 是否位于Phone 旁边,应该更新。

    最后你运行这样的查询:

    WITH myCTE AS
    (
        SELECT j.Phone
              ,coalesce(c.[Work Phone], c.[Home Phone], c.[Cell Phone],'Some dummy?') AS NewPhone
        FROM jobs AS j
        INNER JOIN Easment_Contacts AS e ON j.Easment=e.Easment_ID
        INNER JOIN Contacts As c ON e.Contact_ID=c.CPID
    )
    UPDATE myCTE SET Phone=NewPhone
    

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2016-08-02
      相关资源
      最近更新 更多