子查询返回的值超过1。当子查询用作表达式时,子查询遵循时不允许这样做

时间:2016-05-10 22:18:36

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

我查看了其他答案,但他们都没有回答我做错了什么或者我没有得到它。

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

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)

2 个答案:

答案 0 :(得分:4)

我认为你在寻找的是:

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

答案 1 :(得分:0)

不知道你的桌子结构有点像在魔术玻璃灯泡里读书。这个问题可能是可更新CTE 的一个很好的例子。但请注意,使用 m:n-relation 时,相同的行可能会使用相当随机的值进行更新...

我建议先将CTE的SELECT隔离出来(添加控制输出所需的列,然后检查NewPhone是否位于{{1}旁边1}},应该更新。

最后你运行这样的查询:

Phone