[英]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的其他语法。 但是基本上使用join
或where
子句来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.