通过开始和结束日期进行大查询循环

问题描述

我有一张表,其开始和结束日期为6个月。下面是一个示例:

Row   start_date  end_date
1     2018-09-18   2019-03-18
2     2019-03-18   2019-09-18
3     2019-09-18  2020-03-18

我有一个主表(非常大),所以我遍历了这个start_date和end_date并将所选记录插入到另一个表中。下面是示例查询

     create table dataset.t1 (v1,v2,v3,create_dt);
    
    LOOP
    
        insert into dataset.t1 (v1,create_dt) select v1,create_dt 
    from dataset.t2 where create_dt >= (select start_date from dataset.t1) 
    and create_date < (select end_date from dataset.t1)

END LOOP.

尝试使用Loop时,出现以下错误

Query error: Scalar subquery produced more than one element at.

任何人都可以帮助我实现这一点。我的最终目标是通过将日期划分为不同的范围来提高性能

解决方法

关于您遇到的错误,问题在于您的(select start_date from dataset.t1)返回了多个元素,不确定要实现什么,但是为了使子查询正常工作,它应该类似于{{ 1}}。

我不了解您的循环,因为循环中似乎没有任何变化(除了向t1插入内容之外),还应该考虑循环何时退出。

,

以下内容在SQl服务器中有效。您将必须找到与游标等效的大数据。您可以使用数组来计算开始日期和结束日期并循环浏览。 您可以创建一个临时表来存储开始日期和结束日期,并将其命名为#temp_db。打开游标,然后从#temp_db中获取第一个开始日期和结束日期到变量中。

select start_date,end_date into @start_date,@end_date from #temp_db

执行Sql: 插入#new_tbl

select * from #src_tbl where create_dt >= @start_date and create_dt < @end_date

对于从#temp_db获取的每条记录,请根据您的请求开始插入到新表/同一表中。 如果没有更多的行可以从您的#temp_db ..您将所有记录插入#new_tbl