2017-05-29 254 views
0

我试图使用DBVisualizer工具使用循环与Dbvisualizeer SQL(数据库Vertica的)

--/ 
DECLARE @LoopCounter INT = 1, @MaxEmployeeId INT = 3 

WHILE(@LoopCounter <= @MaxEmployeeId) 
BEGIN 
select * from payment 
where payment_date='2017-05-11' 
END; 
/

上面的代码是给我语法错误执行SQL语句withing循环。 可以在循环中运行语句,如果是的话,我如何创建日期范围的循环 - (从5月11日到15日)。 注意:( - /和/是假定sql中的块被写入)

+0

凡在[Vertica的手动](HTTPS: //my.vertica.com/docs/8.1.x/HTML/index.htm)你有没有找到这种语法? –

+0

@a_horse_with_no_name在网上发现它并非在vertica手册中 –

+0

除非您可以在手册中进行验证,否则您不应该信任“您在网上找到的内容”或者随机查找**明确**告诉您解决方案适用于Vertica(一般不只是“SQL”)。您可能发现了一些适用于SQL Server的内容,而不适用于Vertica。 –

回答

0

否。Vertica不支持其普通SQL语法中的循环。

另请注意,SQL是一种描述性的,面向集合的,而不是过程语言,而这正是Vertica完全遵守的ANSI标准所基于的。

作为专门的大数据平台,Vertica优化其海量数据访问路径本身;和嵌套循环,因为它们来自您建议的过程,所以可以使用不同的策略来避免。

您可能会考虑编写用户定义的标量,转换或聚合函数。 Python,R,Java或C++中的标量;在R,Java或C++中转换;仅在C++中聚合。

但是为了解决您的问题,我会保持设置导向 - 并且只需在我的查询中创建一个集合(即内嵌表),然后使用CROSS JOIN将基本查询与该查询集合在一起。

Vertica的具有时间序列条款,您也可以用它来生成排出来的(几乎)没有......

像这样:

WITH 
-- create a series of integers, call it "index" with column name "loopcounter" 
-- replace 3 in "now() + 3 - 1" with your actual number of employees 
index(loopcounter) AS (
    SELECT row_number() OVER() 
    FROM (
    SELECT 1 
    FROM (
       SELECT now()   AS se 
     UNION ALL SELECT now() + 3 - 1 AS se 
    ) limits 
    TIMESERIES ts AS '1 day' OVER (ORDER BY se) 
) tstab 
) 
SELECT 
    * 
FROM payment 
CROSS JOIN index 
WHERE payment_date = '2017-05-11' 
;