我们可以在 SQL 查询中使用存在来搜索和删除表中的记录吗?
Posted
技术标签:
【中文标题】我们可以在 SQL 查询中使用存在来搜索和删除表中的记录吗?【英文标题】:Can we use exist in a SQL query to search & delete the records from a table? 【发布时间】:2020-09-24 10:18:32 【问题描述】:我使用的是没有分区机制的雪花表,而是有微分区。我们有一个新的要求,即在桌子上执行不同类型的满载。
场景:我有一个包含三列的表:ID、名称、第 1 天的 Current_Location 记录:
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
我的要求是我每天以不同的速率为每个 Current_Location 获取新数据,即第 2 天:
Se Name Current_Location Rate
6 P L6 6000
7 G L7 7000
8 H L7 1100
9 Z L7 1200
根据列中的值:Current_Location,我必须先删除以前的记录,然后再加载新记录。例如,使用 Current_Location L7 在上述场景中,第 1 天有 L7 的两条记录,但在第 2 天,我得到了 3 条记录。所以我必须删除
7 G L7 700
8 H L7 800
然后将 Day2 中的所有三个新记录加载到我的表中。 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
如果可以提高查询的性能,谁能告诉我如何调整/调整查询? 任何帮助表示赞赏。
【问题讨论】:
你的术语很混乱 TRUNCATE 清除整个表 DELETE 删除行 @P.Salmon 那是个错误。我应该首先使用 DELETE 而不是 TRUNCATE。我现在改了。 您可以使用merge
语句将两个语句合并为一个。虽然这不一定会加快您的查询速度,但它确实使它更简单。合并查询文档:docs.snowflake.com/en/sql-reference/sql/merge.html
如果merge语句不能加快查询速度,有没有其他方法可以实现?
您可以使用Current_Location
字段作为集群键对表启用自动集群。这应该会加快删除速度,但这样做会产生成本影响。
【参考方案1】:
你可以使用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);
【讨论】:
这是一个场景,如果我在第 1 天有 3 条记录,而在第 2 天我只有 1 条记录,我必须删除第 1 天的 3 条记录,然后从第 2 天插入一条新记录。所以表中的最终数据将只有第 2 天的一条记录。直到现在我还没有使用合并查询。您能否告诉我上述合并查询是否符合我的要求?以上是关于我们可以在 SQL 查询中使用存在来搜索和删除表中的记录吗?的主要内容,如果未能解决你的问题,请参考以下文章