【问题标题】:SQL Update with Join and Sub Query使用连接和子查询的 SQL 更新
【发布时间】:2023-01-18 23:03:19
【问题描述】:

我有以下查询并且无法将它们放在一起:

DECLARE @Value1 INT = 3
DECLARE @Value2 INT = 6

UPDATE TableA SET 
        Column1 = B.NewValue,
FROM TableA A   INNER JOIN TableB B ON A.NumberId = B.NumberId AND 
AND A.Type = @Value1

UPDATE TableA SET 
        Column2 = B.NewValue,
FROM TableA A INNER JOIN TableB B ON A.NumberId = B.NumberId AND 
AND A.Type = @Value2

我的目标是让一个查询带有一个连接,该连接根据连接中的值更新列。 这只是一个例子(在我的例子中有更多的列,因此有更多的查询)但总的来说我希望尽可能少的查询(在这个例子中:一个查询而不是两个)

DECLARE @Value1 INT = 3
DECLARE @Value2 INT = 6

UPDATE TableA SET 
        Column1 = B.NewValue,  --if the join joins on @Value1
        Column2 = B.NewValue,  --if the join joins on @Value2
FROM TableA A   INNER JOIN TableB B ON A.NumberId = B.NumberId AND 
AND A.Type = B.@Value1/@Value2 

这可能吗(例如使用子查询)?

【问题讨论】:

  • T-SQL 被多种产品使用,例如(但不限于)Sybase、SQL Server 和 Azure Synapse。您使用什么 (R)DBMS?
  • “如果连接在@Value1 上连接”作为用户INNER JOINs 那么JOIN必须发生。因此,您实际上是在LEFT JOINs 之后吗?是这样,如果找不到另一个表中的值会怎样?
  • 我也觉得你的简化可能会隐藏一些实际问题。如果您可以提供实际逻辑和目标的详细信息,以及可能更好地解释问题的有意义的示例数据(和预期结果)。

标签: performance tsql


【解决方案1】:

您可以尝试使用CASE EXPRESSION

UPDATE TableA SET 
        Column1 = CASE WHEN A.Type = @Value1 THEN B.NewValue 
                       ELSE A.Column1 END, 
        Column2 = CASE WHEN A.Type = @Value2 THEN B.NewValue 
                       ELSE A.Column2 END 
FROM TableA A INNER JOIN TableB B ON A.NumberId = B.NumberId AND 
AND A.Type IN (@Value1, @Value2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 2023-03-29
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多