繁体   English   中英

合并多个更新语句

[英]Combine multiple update statements

我想知道是否可以合并以下两个或更多查询? 当前的行为是要对表B进行两次表扫描,但我希望在组合之后再对表B进行一次扫描。 谢谢。

update tableA A
 set A.column2=B.column3
      from tableB B
        where A.column1 = B.column1
        B.column2=1111
        and B.column3 is not null;


update tableA A
 set A.column2=B.column4
      from tableB B
        where A.column1 = B.column1
        and B.column2=2222
        and B.column4 is not null;

这将是sql-server语法,我很确定这会交叉,但是我看过一些文章建议使用mysql的其他语法。 但是基本上使用joinwhere子句来relate表,然后使用case语句选择值。 在下面的解决方案中,您将永远不会使用case语句的ELSE ,但为了更好地参考与您的join匹配但与case语句条件不匹配的任何内容的当前列值。

使用JOIN

UPDATE a
    SET Column1 = CASE
       WHEN b.Column1 = 1111 THEN b.Column2
       WHEN b.Column1 = 2222 THEN b.Column3
       ELSE a.Column1
    END
FROM
    [DatabaseA].TableA a
    INNER JOIN [DatabaseB].TableB b
    ON a.Column4 = b.Column4
    AND (
          (b.Column1 = 1111 AND b.Column2 IS NOT NULL)
          OR
          (b.Column1 = 2222 AND b.Column3 IS NOT NULL)
       )

根据您对不使用联接的评论。

UPDATE a
    SET Column1 = CASE
       WHEN b.Column1 = 1111 THEN (SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4)
       WHEN b.Column1 = 2222 THEN (SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4)
       ELSE a.Column1
    END
FROM
    TableA
WHERE
    EXISTS (
       SELECT *
       FROM
          TableB
       WHERE
          b.Colmn4 = a.Column4
          AND (
                (b.Column1 = 1111 AND b.Column2 IS NOT NULL)
                OR
                (b.Column1 = 2222 AND b.Column3 IS NOT NULL)
             )

看起来很疯狂,但它只会更新您想要的行。 否则,如果您不在乎是否更新整个列,则可以执行以下操作。

UPDATE a
    SET Column1 = CASE
       WHEN b.Column1 = 1111 THEN ISNULL((SELECT b.Column2 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 1111),a.Column1)
       WHEN b.Column1 = 2222 THEN ISNULL((SELECT b.Column3 FROM TableB WHERE b.Column4 = a.Column4 AND b.Column1 = 2222),a.Column1)
       ELSE a.Column1
    END
FROM
    TableA

如果您愿意更新整个表,也可以使用单个子选择来完成。

UPDATE a
    SET Column1 = ISNULL(

       (       SELECT (CASE WHEN b.Column1 = 1111 THEN b.Column2 ELSE b.Column3 END)
       FROM
          TableB
       WHERE
          b.Colmn4 = a.Column4
          AND (
                (b.Column1 = 1111 AND b.Column2 IS NOT NULL)
                OR
                (b.Column1 = 2222 AND b.Column3 IS NOT NULL)
             )
        ),a.Column1)    
FROM
    TableA

所有这些答案的诀窍在于,您必须能够将TableB的SELECT语句与TableA相关联,否则您将无法获得预期的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM