在 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 语句中使用多个条件更新表中的单个列的主要内容,如果未能解决你的问题,请参考以下文章

1.《SQL必知必会》--(更新中...)

用单个列从另一个表更新一个表中的多个列?

SQL语句

使用带有 WHERE 条件的单个查询 (SQL Express 2005) 从多个表中删除行

16-3 update语句

mysql语句where条件中的是啥意思