首页 > 解决方案 > 在 Vertica 中使用 UNION ALL 运算符运行很长的 SQL 查询时出错

问题描述

这是 Vertica Query 中使用的子查询示例,它是从应用程序生成的字符串。

SELECT 1 as ID, 345.45 as PaidAmt FROM DUAL
UNION ALL 
SELECT 2 as ID, 789.45 as PaidAmt FROM DUAL
UNION ALL
...
...

在某些情况下,随着使用 UNION ALL 的行数增加,此子查询会变得很大。Vertica 在一定程度上支持这种查询。但是当在子查询中使用 3000 + UNION ALL 运算符时,它会引发错误。

[SQL 错误 [4963] [54001]:[Vertica]VJDBC 错误:查询包含 SET 操作树,该操作树过于复杂而无法分析

我找不到任何有关在查询中有限使用 UNION ALL 运算符或查询字符串长度的文档。

Vertica 或 Linux 中是否有任何系统参数可以更改其值以成功执行查询?

我有另一种方法来修复删除 UNION ALL 的查询。但是正在寻找产生错误的解决方案。

提前致谢!

标签: sqlunionvertica

解决方案


如果 CSV 选项被证明是不可能的,我会使用一个临时表 - 它也会加快您的查询速度:

CREATE LOCAL TEMPORARY TABLE helper_table(id,paidamt)
ON COMMIT PRESERVE ROWS AS
          SELECT 1, 345.45 
UNION ALL SELECT 2, 789.45 
UNION ALL SELECT 3, 213.44
[.2997 more rows . .]
;

INSERT INTO helper_table
          SELECT 3001, 4345.45 
UNION ALL SELECT 3002, 3789.45 
UNION ALL SELECT 3003, 1213.44
[.2997 more rows . .]
;

SELECT
  <<whatever>>
FROM helper_table JOIN <<other_tables>> ON <<whatever>> 
;

helper_table一旦您再次注销,它将立即消失。

或者,将 vsql 与如下脚本一起使用:

CREATE LOCAL TEMPORARY TABLE helper_table (
  id      INT
, paidamt NUMERIC(9,2)
)
ON COMMIT PRESERVE ROWS;

COPY helper_table FROM stdin;
   1|  345.45 
   2|  789.45 
   3|  213.44
3001| 4345.45 
3002| 3789.45 
3003| 1213.44
\.

-- Now you can work with it ...
SELECT * FROM helper_table;

推荐阅读