我想知道是否可以合并以下两个或更多查询? 当前的行为是对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;
答案 0 :(得分:0)
这将是sql-server语法,我很确定这个结束但我已经看到一些文章建议mysql的其他语法。但基本上使用join
或where
子句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相关联,否则你将无法获得预期的结果。