在 WHERE 语句中使用多个条件更新表中的单个列
Posted
技术标签:
【中文标题】在 WHERE 语句中使用多个条件更新表中的单个列【英文标题】:Update single column in a table with with multiple conditions in the WHERE statement 【发布时间】:2021-01-06 03:30:48 【问题描述】:我正在尝试编写一个 UPDATE 语句来根据多个 WHERE 条件更新表中的列。请参阅下面的查询,
UPDATE table_new
SET col_4 = 'new value'
WHERE ?
(SELECT col_1, col_2, col_3 FROM table_new
EXCEPT
SELECT col_1, col_2, col_3 FROM table_old);
我尝试使用来自 EXPECT SQL 查询的唯一 col_1 + col_2 + col_3 组合的新值更新 col_4。我不确定 WHERE 条件后面会发生什么,因为 WHERE 子句通常在 UPDATE 语句中只有一列。我正在考虑为 EXPECT SQL 查询和 WHERE 子句后面的列名的唯一 col_1 + col_2 + col_3 组合做一个 CONCAT,但不确定这是否有助于我的情况
我可能的解决方案:
UPDATE table_new
SET col_4 = 'new value'
WHERE CONCAT('col_1','-','col_2','-','col_3') IN
(SELECT CONCAT('col_1','-','col_2','-','col_3') FROM table_new
EXCEPT
SELECT CONCAT('col_1','-','col_2','-','col_3') FROM table_old
);
table_new 中的样本数据(在运行 UPDATE 语句之前):
Col_1 Col_2 Col_3 Col_4 (old value)
123456 123XYZ 456ABC 100
654321 ZYX321 CBA654 200
table_new 中的期望结果(运行 UPDATE 语句后):
Col_1 Col_2 Col_3 Col_4 (new value)
123456 123XYZ 456ABC 300
654321 ZYX321 CBA654 400
【问题讨论】:
请提供样本数据和所需结果,以及适当的数据库标签。 我已经添加了示例数据和所需结果以及适当的数据库标签以便更好地理解 【参考方案1】:我认为你最好只使用一个连接子句:
UPDATE table_new
SET col_4 = 'new value'
FROM table_new tn
LEFT JOIN table_old to ON tn.col_1 = to.col_1
AND tn.col_2 = to.col_2
AND tn.col_3 = to.col_3
WHERE to.col_1 IS NULL;
左连接将为您提供匹配/不匹配的记录,然后您可以通过查找这些结果右侧 (table_old) 中的空字段来确定旧表中的记录不在新表中的位置.如果需要更具体,可以在 WHERE 子句中为所有列名添加 IS NULL 语句。
【讨论】:
【参考方案2】:无需连接变量,您可以同时按多个列进行比较和分组,例如WHERE (b.x,b.y,b.z) = (a.x,a.y,a.z)
:
create temp table a_new as
select 'a' x, 'b' y, 'c' z, 100 value
union all
select 'a1', 'b1', 'c1', 200 value;
create temp table a_old as
select 'a' x, 'b' y, 'c' z, 300 value
union all
select 'a1', 'b1', 'c1', 500 value;
update a_new as a
set value = b.value
from a_old b
where (b.x,b.y,b.z) = (a.x,a.y,a.z);
【讨论】:
以上是关于在 WHERE 语句中使用多个条件更新表中的单个列的主要内容,如果未能解决你的问题,请参考以下文章