我们是否可以在SQL查询中使用exist来搜索&;是否从表中删除记录?
我使用的雪花表没有分区机制,而是有微分区。我们有一个新的要求,在工作台上执行不同类型的满载 场景:我有一个表,有三列:ID、名称、第1天的当前位置记录:我们是否可以在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
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天的一条记录。直到现在我还没有使用合并查询。您能告诉我上述合并查询是否符合我的要求吗?