避免雪花中存储过程的重复

Posted

技术标签:

【中文标题】避免雪花中存储过程的重复【英文标题】:Avoiding duplicates in the stored procedures in snowflake 【发布时间】:2020-09-15 03:08:56 【问题描述】:

我已经编写了一个存储过程来将值插入到表中。但是当我两次调用存储过程时,重复的值被插入到表中。如何避免存储过程中的值重复。

这是我的存储过程:

CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE javascript
AS
$$
var stmt = snowflake.createStatement(
    sqlText: "SELECT * FROM " + TABLE_NAME + " LIMIT 1;",    
);
stmt.execute();

var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i++) 
  INSERT INTO TABLE1 (Col_Name) VALUES ('+"stmt.getColumnName(i)"+');  //DUPLICATE VALUES

return cols
$$;

编辑:

我正在检索 Col_table 的列名,例如 (Col1, Col2, Col3),我希望将这些列名放入 TABLE1。

我调用了过程call get_columns(Col_table) 并将列名插入到TABLE1 中。

当我再次调用过程call get_columns(Col_table) 时,TABLE1 将具有重复值作为(Col1, Col2, Col3, Col1, Col2, Col3)。我想通过使用合并或更新或任何其他方法来避免重复。

【问题讨论】:

您能给我们提供样本输入和最终结果吗?程序get_columns的目标是什么? @FelipeHoffa 你能看看我的编辑吗 你提前知道列数吗?是否有有效的标识符来检查记录是否唯一? @Sujitmohanty30 我事先不知道列数。没有有效的标识符来检查记录是否唯一。我想在插入时避免重复。 @R0bert 我的回答是希望插入只发生一次。但是你的目标是在不同的表上多次调用这个方法并且只有不同的列名? 【参考方案1】:

基于编辑的问题和 cmets:

    “当我再次调用过程 [...] 时,TABLE1 将具有重复值 [...]。我想通过使用合并或更新或任何其他方法来避免重复”
    “当我在两个不同的表列上调用过程时,INSERT OVERWRITE 正在替换表的行”

然后,如果您不想在现有表中插入重复值,您可以执行以下操作:

INSERT INTO TABLE1(Col_Name) 
SELECT *
FROM (SELECT 'i' x)
WHERE x NOT IN (SELECT Col_Name FROM TABLE1);

在您的过程中替换该 SQL 代码,您将不会看到重复的值。将'i' 替换为您要插入的值。

(作为一般性评论:我不确定问题中的过程是否是解决整体所述问题的最有效解决方案,但这将解决重复行的具体问题)

【讨论】:

我不想将内容覆盖到表中,但在附加到目标表之前,我想检查是否存在具有相同值的行。如果该行不存在,那么我不想插入到表中。 当我在两个不同的表列上调用过程时,INSERT OVERWRITE 正在替换表的行 感谢您的回答,但我想知道是否有任何优化的方法来解决这个问题,因为如果一个表包含数百万行,那么计算需要很长时间 想知道:在这种情况下,为什么您会期望一个包含数百万行的表 - 您是否会以某种方式拥有数百万个不同的表列名称?

以上是关于避免雪花中存储过程的重复的主要内容,如果未能解决你的问题,请参考以下文章

如何获取雪花中执行存储过程的名称?

雪花存储过程中的事务

在雪花存储过程中捕获成功消息

Python Glue 作业 - 雪花存储过程未返回确切的错误消息

报告存储过程 - 如何避免重复?

雪花中的存储过程中是不是有打印命令