使用 WHERE 语句中的多个条件更新 table 中的单个列
Update single column in a table with with multiple conditions in the WHERE statement
我正在尝试编写一个 UPDATE 语句来根据多个 WHERE 条件更新 table 中的列。请参阅下面的查询,
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
无需连接变量,您可以同时对多列进行比较和分组,例如 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);
我认为你最好只使用连接子句:
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;
左联接将为您提供 matching/non 匹配记录,然后您可以通过查找这些结果右侧 (table_old) 中的空字段。如果您需要它更具体,您可以在所有列名的 WHERE 子句中添加 IS NULL 语句。
我正在尝试编写一个 UPDATE 语句来根据多个 WHERE 条件更新 table 中的列。请参阅下面的查询,
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
无需连接变量,您可以同时对多列进行比较和分组,例如 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);
我认为你最好只使用连接子句:
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;
左联接将为您提供 matching/non 匹配记录,然后您可以通过查找这些结果右侧 (table_old) 中的空字段。如果您需要它更具体,您可以在所有列名的 WHERE 子句中添加 IS NULL 语句。