使用雪花中的合并将值插入表并根据条件删除行
Posted
技术标签:
【中文标题】使用雪花中的合并将值插入表并根据条件删除行【英文标题】:Inserting values into a table and delete rows based on a condition using merge in snowflake 【发布时间】:2020-09-30 14:22:12 【问题描述】:我有一个包含 DBName、SCName、Number 的表。我编写了一个程序,将 DBName、SCName 插入表中,并在 Number 为 0 时删除一行。我使用合并来避免重复并根据条件插入,但我不明白如何在 Number= 时删除一行0.
------------------------
|DBName| SCName| Number|
| DB1 | SC1 | 1 |
| DB2 | SC2 | 0 | <-- Need to delete row
| DB2 | SC3 | 2 |
| DB2 | SC1 | 4 |
| DB3 | SC4 | 0 | <-- Need to delete row
------------------------
这是我的程序:
CREATE TABLE TABL(DBName VARCHAR, SCName VARCHAR); // creating table
CREATE OR REPLACE PROCEDURE repo(DB VARCHAR,SC VARCHAR)
RETURNS string
LANGUAGE javascript
AS
$$
//inserting values into table using merge
//if values are already present and Number = 0 then I need to delete row
var sql_command = `merge into TABL as t
using (SELECT :1 as database,:2 as schema) as s
on t.DBName = s.database
and t.SCName = s.schema
when matched then update
set t.DBName = t.DBName
when not matched then insert
(DBName, SCName) VALUES (:1,:2)`;
snowflake.execute(sqlText: sql_command, binds: [DB, SC]);
return 'success';
$$;
【问题讨论】:
【参考方案1】:我不明白在哪种情况下(匹配/不匹配)应该从目标表中删除带有“0”的行。
但一般情况下,您只能在 MATCH 情况下使用 DELETE:
when matched and number=0 then delete
避免合并的不确定结果很重要(请参阅下面“重复连接行为”下的链接)。解决方案是在“匹配时更新”子句中添加“and number!=0”。
更多信息:https://docs.snowflake.com/en/sql-reference/sql/merge.html
编辑:我发布了错误的信息。对于 MATCH,您可以删除和更新,对于 NOT MATCH,您可以插入。
【讨论】:
我正在使用更新函数来更新更改的行,并且在更新过程中,如果我发现该表包含 Number=0 的行,那么我需要删除整行 然后你必须在更新子句之后添加“当匹配并且 number=0 然后删除”并将“and number!=0”添加到更新子句。如上所述:) 我在写when not matched then insert (DBName, SCName) VALUES (:1,:2) WHEN NOT MATCHED and Number=0 THEN DELETE
时遇到语法错误。你能告诉我哪里出错了
“数字”列必须是目标表中的一列
Marcel,所以可以有两个not matched
语句对吗?以上是关于使用雪花中的合并将值插入表并根据条件删除行的主要内容,如果未能解决你的问题,请参考以下文章
编写 SQL 语句通过 join id 查找行,并将连接行中的值插入到父表中