运行含超5万条UNION ALL的超长SQL查询报错,求无INSERT/CREATE TABLE权限的替代方案
无建表插数权限下批量构造数据集的替代方案
原方案报错是因为绝大多数数据库对单个查询的语句长度、可解析的UNION分支数都设置了阈值,5万条UNION ALL远超过常规上限,必然会触发解析或执行错误,以下是无需额外权限的可行替代方案:
- 方案1:使用
VALUES行构造器批量生成
这是兼容性最高、改动最小的替代方案,主流数据库(PostgreSQL、MySQL 8.0+、SQL Server、BigQuery等)都支持直接在CTE中用VALUES构造多行数据,不需要逐行写UNION ALL,解析效率高,行数上限也远高于UNION ALL的分支数限制。
示例代码:
如果遇到VALUES行数上限,可拆成多个短的VALUES块用UNION ALL拼接,每块放10000行,仅需要4-5个UNION ALL即可,远低于数据库阈值。Table_1 AS ( SELECT * FROM (VALUES ('ABC', 'lowercase', 'letters', '123'), ('XYZ', 'uppercase', 'letters', '568'), -- 剩余49998行直接按该格式加逗号分隔即可 ('XXX', 'xxx', 'xxx', 'xxx') ) AS t(Abbreviation, Value_Set, Value_Set_Type, Codes) ) SELECT * FROM Table_1 - 方案2:长字符串拆分法
如果VALUES也触发行数限制,可以把所有数据按固定分隔符拼接成单个长字符串,用数据库内置的字符串拆分函数拆解为行后再分列。
示例(以SQL Server为例):Table_1 AS ( SELECT PARSENAME(REPLACE(value, ',', '.'), 4) AS Abbreviation, PARSENAME(REPLACE(value, ',', '.'), 3) AS Value_Set, PARSENAME(REPLACE(value, ',', '.'), 2) AS Value_Set_Type, PARSENAME(REPLACE(value, ',', '.'), 1) AS Codes FROM STRING_SPLIT('ABC,lowercase,letters,123|XYZ,uppercase,letters,568|xxx,xxx,xxx,xxx', '|') ) SELECT * FROM Table_1 - 方案3:JSON数组解析法
支持JSON解析的数据库可以把数据集序列化为JSON数组,直接用JSON解析函数生成表,结构清晰不容易出错。
示例(以MySQL 8.0+为例):Table_1 AS ( SELECT json_extract(value, '$[0]') AS Abbreviation, json_extract(value, '$[1]') AS Value_Set, json_extract(value, '$[2]') AS Value_Set_Type, json_extract(value, '$[3]') AS Codes FROM JSON_TABLE( '[["ABC","lowercase","letters","123"],["XYZ","uppercase","letters","568"]]', '$[*]' COLUMNS(value JSON PATH '$') ) AS t ) SELECT * FROM Table_1
内容的提问来源于stack exchange,提问作者Drewtheman
相关产品推荐
相关产品推荐

