snowflake-cloud-data-platform - 如何根据两个表上的一个字段/列更新行
问题描述
我想使用字段“Id”上的另一个表来更新一个表,这样它就不会创建重复项
假设我的第一个表是Table1,第二个表是Table2。当 Id 匹配时,我想从Table2更新Table1中的行
我知道使用 UNION 函数,但这适用于我只需要考虑单个列的整个列。https://docs.snowflake.com/en/sql-reference/operators-query.html#union-all
我的表格示例
表格1
Id name number value
1 a 8 100
2 b 8 100
3 c 8 100
4 d 8 100
表2
Id name number value
3 c 8 99
4 d 6 100
5 e 7 100
预期产出
Id name number value
1 a 8 100
2 b 8 100
3 c 8 99
4 d 6 100
5 e 7 100
请注意,在输出表中,ID 为 3,4 的行已更新,并插入了新的 ID 5。
PS:如果有人能给我提供 select语句来获取输出表就更好了。
解决方案
您正在搜索的构造称为MERGE:
CREATE OR REPLACE TABLE trg(Id INT, name VARCHAR, number INT, value INT)
AS SELECT 1 ,'a', 8, 100
UNION SELECT 2 ,'b', 8, 100
UNION SELECT 3 ,'c', 8, 100
UNION SELECT 4 ,'d', 8, 100;
CREATE OR REPLACE TABLE src(Id INT, name VARCHAR, number INT, value INT)
AS SELECT 3 ,'c', 8, 99
UNION SELECT 4 ,'d', 6, 100
UNION SELECT 5 ,'e', 7, 100;
询问:
MERGE INTO trg
USING src
ON trg.Id = src.Id
WHEN MATCHED THEN UPDATE SET name = src.name,
number = src.number,
value = src.value
WHEN NOT MATCHED THEN INSERT (ID, name, number, value)
VALUES (src.Id, src.name, src.number, src.value);
SELECT * FROM trg;
输出:
编辑:
PS:如果有人能给我提供select语句来获取输出表就更好了。
可以使用 UNION ALL 与 QUALIFY 结合:
WITH cte AS (
SELECT *, 1 AS priority FROM trg
UNION ALL
SELECT *, 0 AS priority FROM src
)
SELECT Id, Name, Number, Value
FROM cte
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Priority) = 1
ORDER BY Id;
推荐阅读
- python - 如何动态检查具有命名占位符的格式字符串,例如“{foo} {bar} {baz}”
- python - 遍历两列并匹配熊猫中不同行的值
- c - 我想在多位数字问题中找到进位操作的数量
- python - 如何创建一个可以像 module.subsection.function() 一样使用的模块?
- javascript - Arr.map 返回 null 而不是完全删除对象?
- sql - Oracle 云资源管理器的 SQL 查询
- sql - 我想连接一些行
- asp.net - 试图让日期选择器在带有 Bootstrap 的 asp.net C# 页面中工作
- python - 打开 RSA 文件并使用 Python 3 加密消息
- c++ - 在 C++ 中递增和递减全局变量时的竞争条件