sql - 在 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 的查询。但是正在寻找产生错误的解决方案。
提前致谢!
解决方案
如果 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;
推荐阅读
- android - 将数据(包括图像)从 ListView 传递到另一个活动(独立于每个 ListView 选项)并初始化每个活动的起始值
- python - Django 无法执行 python manage.py runserver
- regex - 如何使用正则表达式匹配由任意数量的字符和空格分隔的两个单词?
- node.js - 如何以角度 6 获取 EPOCH 日期时间格式?
- javascript - if 语句中的构造函数返回未捕获类型错误
- powershell - 如何在 Jenkins 的声明性管道上的 powershell 脚本中获取更新的环境变量值
- java - 选择垃圾收集器的性能指标
- vue.js - Vuetify 数据表头的国际化
- tensorflow - 如何在 tf.estimator 上轻松调用预测?
- cmake - Cmake 项目运行良好。但是智能感知不起作用