问题描述
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
。