在 Vertica 中使用 UNION ALL 运算符 运行 非常长 SQL 查询时出错

Error while running very long SQL query with UNION ALL operator in Vertica

这是 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 Error [4963] [54001]: [Vertica]VJDBC ERROR: The query contains a SET operation tree that is too complex to analyze

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

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

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

提前致谢!

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

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;