SQLite查询引用另一表列中存储的表的列出错,如何修改?
问题原因分析
你原来的查询之所以报错,是因为子查询select I2table from All_I返回的是表名的字符串内容(比如R1I2),而不是把这个字符串当作实际的数据表来查询。所以别名n对应的结果集只有I2table这一列,自然找不到n.I_NAME这个列。
解决方案
SQLite的静态SELECT语句不支持直接用列值作为表名,必须通过动态SQL实现,也就是先获取表名字符串,再拼接成完整的查询语句执行。以下是两种常见场景的实现方式:
场景1:在应用程序中使用SQLite驱动
- 先执行查询获取All_I中的表名:
SELECT I2table FROM All_I; - 在应用代码中拿到返回的表名(比如
R1I2),拼接成目标SQL语句:SELECT "I_NAME" as I2Name FROM [拼接的表名]; - 执行拼接后的SQL语句即可得到结果。
场景2:在SQLite命令行/支持动态SQL的环境中(SQLite 3.35.0及以上)
SQLite 3.35.0开始支持EXECUTE IMMEDIATE语法,可以直接执行动态生成的SQL:
单条表名的情况
如果All_I中只有一条记录,直接执行:
EXECUTE IMMEDIATE ( SELECT 'SELECT "I_NAME" as I2Name FROM ' || quote(I2table) FROM All_I LIMIT 1 );
quote()函数用于安全转义表名,避免特殊字符或SQL注入问题。
多条表名的情况
如果All_I中有多个表名,需要合并所有表的I_NAME结果,可以先创建临时表存储结果,再批量插入:
-- 创建临时表存结果 CREATE TEMP TABLE IF NOT EXISTS temp_results (I2Name TEXT); -- 动态生成SQL并执行插入 WITH table_names AS (SELECT I2table FROM All_I) INSERT INTO temp_results EXECUTE IMMEDIATE ( SELECT GROUP_CONCAT( 'SELECT "I_NAME" FROM ' || quote(I2table), ' UNION ALL ' ) FROM table_names ); -- 查询最终结果 SELECT I2Name FROM temp_results;
内容的提问来源于stack exchange,提问作者CodeL
相关产品推荐
相关产品推荐

