组合多个更新语句

时间:2016-06-20 17:37:16

标签: mysql sql sql-update

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

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;

1 个答案:

答案 0 :(得分:0)

这将是sql-server语法,我很确定这个结束但我已经看到一些文章建议mysql的其他语法。但基本上使用joinwhere子句relate表,然后使用case语句来选择你的值。在下面的解决方案中,您永远不会使用ELSE语句的case,但为了获得良好的衡量标准,请参考与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相关联,否则你将无法获得预期的结果。