【问题标题】:Is it possible to update a pair of values in TSQL from a subquery?是否可以从子查询更新 SQL 中的一对值?
【发布时间】:2021-10-31 18:33:44
【问题描述】:

我可以使用相同的子查询而不是调用两次来更新一对列吗?

-- Table D contains a Date and a ProcessId

UPDATE T1
SET (Val1, Val2) = (
    SELECT SUM(Val1A), SUM(Val2A) 
    --Val1A and Val2A are equations and are not taken from just one table but multiple
    FROM D
      INNER JOIN T8 ON T8.ProcessId = D.ProcessId
      INNER JOIN T4 ON T4.Id = T8.T4Id
      INNER JOIN T6 ON T4.Id = T6.T4Id
    WHERE D.Date <= @ProcessDate AND T6.T4Id = T1.T4Id)
FROM T1
  INNER JOIN T4 ON T4.Id = T1.T4Id
  INNER JOIN T5 ON T5.Id = T1.T5Id
  INNER JOIN T6 ON T4.Id = T6.T4Id
  INNER JOIN T7 ON T7.Id = T4.T7Id

而不是做

UPDATE T1
SET Val1 = (SELECT Val1A
     FROM T2 
       INNER JOIN T8 ON T8.T2Id = T2.Id
       INNER JOIN T4 ON T4.Id = T8.T4Id
       INNER JOIN T6 ON T4.Id = T6.T4Id
     WHERE T4.T1Id = T1.Id)
    Val2 = (SELECT Val2A
     FROM T2 
       INNER JOIN T8 ON T8.T2Id = T2.Id
       INNER JOIN T4 ON T4.Id = T8.T4Id
       INNER JOIN T6 ON T4.Id = T6.T4Id
     WHERE T4.T1Id = T1.Id)
FROM T1
  INNER JOIN T4 ON T4.Id = T1.T4Id
  INNER JOIN T5 ON T5.Id = T1.T5Id
  INNER JOIN T6 ON T4.Id = T6.T4Id
  INNER JOIN T7 ON T7.Id = T4.T7Id

注意:FROM 和 WHERE 子句显然比这更复杂

【问题讨论】:

  • 为什么不把JOIN 放在FROM 中?
  • 内部查询用于根据从外部查询传递的日期和 Id 计算新值,因此简单的连接不起作用
  • 什么日期?所有的连接都在IDs。
  • 我觉得你试图“简化”这个问题正在混淆它。如果您发布更具代表性的示例,那将有助于我们为您提供帮助。例如,当您的 SQL 中没有日期列时,谈论日期是没有意义的。

标签: sql sql-server tsql sql-update


【解决方案1】:

您可以使用CROSS JOIN 和子查询。虽然上面的逻辑真的很奇怪;您正在更新T1 中的每一行,即使它与T2T3 无关。另外,根据上述情况,子查询只能返回 1 行,因此您的表 T2T3 也必须只有一行。

UPDATE T1
SET Val1 = sq.Val1A,
    Val2 = sq.Val2A
FROM dbo.T1
     CROSS JOIN (SELECT T2.Val1A,
                        T2.Val2A
                 FROM dbo.T2
                      JOIN dbo.T3 ON T2.Id = T3.Id) sq;

对于您的最新编辑,您将上面的查询编写如下:

UPDATE T1
SET Val1 = Val1A,
    Val2 = Val2A
FROM T1
  INNER JOIN T4 ON T4.Id = T1.T4Id
  INNER JOIN T5 ON T5.Id = T1.T5Id
  INNER JOIN T6 ON T4.Id = T6.T4Id
  INNER JOIN T7 ON T7.Id = T4.T7Id
  INNER JOIN T4 ON T4.T1Id = T1.Id
  INNER JOIN T6 ON T4.Id = T6.T4Id
  INNER JOIN T8 ON T4.Id = T8.T4Id
  INNER JOIN T2 ON T8.T2Id = T2.Id

【讨论】:

  • 抱歉,这是我的错误,我已经更新了代码以更准确地反映我的问题。
【解决方案2】:

您可以改用outer apply

UPDATE T1
    SET Val1 = X.Val1,
        Val2 = X.Val2    
FROM T1 JOIN
     T4
     ON T4.Id = T1.T4Id JOIN
     T5
     ON T5.Id = T1.T5Id JOIN
     T6
     ON T4.Id = T6.T4Id
     T7
     ON T7.Id = T4.T7Id OUTER APPLY
     (SELECT SUM(Val1A), SUM(Val2A) 
    --Val1A and Val2A are equations and are not taken from just one table but multiple
      FROM D JOIN
           T8
           ON T8.ProcessId = D.ProcessId JOIN
           T4
           ON T4.Id = T8.T4Id JOIN
           T6
           ON T4.Id = T6.T4Id
      WHERE D.Date <= @ProcessDate AND 
            T6.T4Id = T1.T4Id
     ) x;

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-01-02
    相关资源
    最近更新 更多