【问题标题】:Update a table with values from another table (which has 3 keys and only 2 keys found in the other matching table)用另一个表中的值更新一个表(该表有 3 个键,但在另一个匹配表中只找到 2 个键)
【发布时间】:2018-10-27 13:29:55
【问题描述】:

表 1(关键字段 - ID、帐户)

  • Id、Account、SalesRepID

表 2(关键字段 - ID、帐户、代码)

  • Id、Account、Sequence、SalesRepID

当 Table2.Sequence = 1 时,应使用 Table2.SalesRepID 更新 Table1.SalesRepID。(有 10 个序列,每个序列都有一个 SalesRedID)。

UPDATE Table1 SET SalesRepID = 
(select SalesRepID from Table2 
where Table1.ID = Table2.ID and 
Table1.Account = Table2.PatientAccount and Table2.Sequence = 1)

这会引发错误 -

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

请让我知道应该在更新声明中修复什么? 应该使用 MERGE 吗?

【问题讨论】:

  • 如果Table2.Sequence = 1 的记录不止一条,那么您的更新逻辑本身就没有意义,因为您不清楚要使用哪个 值在更新中。为获得最佳结果,请在您的问题中添加一些示例数据。

标签: sql sql-server merge


【解决方案1】:

您最好使用 JOIN。

UPDATE t1 
SET 
    t1.SalesRepID = t2.SalesRepID
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID AND t1.Account = t2.PatientAccount AND t2.Sequence = 1

它会更容易维护和扩展。

【讨论】:

    【解决方案2】:

    你不明白错误的哪一部分?

    Table2 中有多个符合条件的行。您可以使用以下方法找到这些:

    select id, PatientAccount
    from table2
    where sequence = 1
    group by id, PatientAccount
    having count(*) > 1;
    

    您可以使用以下方法使您的查询工作:

    update Table1 
        set SalesRepID = (select top (1) t2.SalesRepID
                          from Table2 t2
                          where Table1.ID = t2.ID and 
                                Table1.Account = t2.PatientAccount and
                                t2.Sequence = 1
                         );
    

    但是,这是一种蛮力方法/破解。您确实需要弄清楚数据有什么问题(也就是说,为什么您认为子查询实际上返回多行时应该返回一行)。

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多