我们是否可以在SQL查询中使用exist来搜索&;是否从表中删除记录?

我们是否可以在SQL查询中使用exist来搜索&;是否从表中删除记录?,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我使用的雪花表没有分区机制,而是有微分区。我们有一个新的要求,在工作台上执行不同类型的满载 场景:我有一个表,有三列:ID、名称、第1天的当前位置记录: Se Name Current_Location Rate 1 A L1 100 2 B L2 200 3 C L3 300 4 D L4

我使用的雪花表没有分区机制,而是有微分区。我们有一个新的要求,在工作台上执行不同类型的满载

场景:我有一个表,有三列:ID、名称、第1天的当前位置记录:

Se  Name    Current_Location     Rate
1   A           L1               100
2   B           L2               200
3   C           L3               300
4   D           L4               400
5   E           L5               500
6   F           L6               600
7   G           L7               700
8   H           L7               800
我的要求是,我每天以不同的速率获取每个当前位置的新数据,即第2天:

Se  Name    Current_Location     Rate
6   P           L6               6000
7   G           L7               7000
8   H           L7               1100
9   Z           L7               1200
根据列:Current_Location中的值,我必须先删除以前的记录,然后加载新记录。例如,对于上述场景中的当前位置L7,在第1天L7有两条记录,但在第2天,我得到了三条记录。所以我必须删除

7   G           L7               700
8   H           L7               800
然后将第2天的所有三条新记录加载到我的表中。L6也是如此。删除和加载后的最终表格应如下所示:

Se  Name    Current_Location     Rate
1   A           L1               100
2   B           L2               200
3   C           L3               300
4   D           L4               400
5   E           L5               500
6   P           L6               6000
7   G           L7               7000
8   H           L7               1100
9   Z           L7               1200
为此,我实施了:

select * 
from maintable 
where exists (select 1 
              from stagingtable 
              where maintable.keycolumn = stagingtable.keycolumn)
该查询将生成我想要的数据

delete from maintable 
where exists select 1 
             from stagingtable 
             where maintable.keycolumn = stagingtable.keycolumn
我将其转换为一个
delete
查询,以便使用该查询删除记录,然后运行

insert into maintable (select * from stagingtable)
有没有比使用更好的方法

delete from maintable 
where exists select 1 
             from stagingtable 
             where maintable.keycolumn = stagingtable.keycolumn
如果可以提高查询的性能,有人能告诉我如何调整查询吗?
非常感谢您的帮助。

您可以使用
merge

merge into maintable using (
    select keycolumn, v 
    from stagingtable 
) as b on maintable.keycolumn = b.keycolumn
  when matched then update set maintable.v = b.v
  when not matched then insert (keycolumn, v) values (b.keycolumn, b.v);

您对术语感到困惑截断清除整个表删除删除rows@P.Salmon那是个错误。我应该先用DELETE而不是TRUNCATE。我现在更改了。您可以使用
merge
语句将两个语句汇总为一个。虽然这不一定会加快查询速度,但确实会使查询更简单。合并查询文档:如果Merge语句不能加快查询速度,是否有其他方法可以实现它?您可以使用
当前位置
字段作为集群键在表上启用自动集群。这应该会加快删除速度,但这样做会带来成本。下面是一个场景,如果我在第1天有3条记录,而在第2天只有1条记录,我必须删除第1天的3条记录,然后从第2天插入一条新记录。因此,表中的最终数据将仅为第2天的一条记录。直到现在我还没有使用合并查询。您能告诉我上述合并查询是否符合我的要求吗?