使用多个SQL WITH子句后在SELECT查询引用变量报错,求正确语法
问题分析与修正
你的SQL语法错误在于直接将CTE的别名当作列名使用,数据库无法识别display_name_fid和index_clid是你定义的公共表表达式(CTE),会把它们当成普通列名,因此报错“column does not exist”。
错误原因拆解
- 在
ids子句中,WHERE fid = display_name_fid这行,display_name_fid是你定义的CTE名称,不是列,必须通过子查询获取它的结果值。 - 最终SELECT的
AND clid = index_clid同理,index_clid是CTE名称,不能直接当作列值使用。
修正后的代码(适配单值返回需求)
因为你期望最终输出单个值,假设display_name_fid和index_clid这两个CTE都只会返回一行一列,可以用标量子查询来引用它们的结果:
WITH display_name_fid AS ( SELECT fid FROM field WHERE name = 'DisplayName' AND sid = 8 ), index_clid AS ( SELECT clid FROM class WHERE name = 'Index' ), ids AS ( SELECT id FROM SVAL WHERE fid = (SELECT fid FROM display_name_fid) AND val IN ('bchm30p') ) SELECT ident FROM id WHERE id IN (SELECT id FROM ids) AND clid = (SELECT clid FROM index_clid);
备选方案(多值场景)
如果display_name_fid或index_clid可能返回多个值,需要将=改为IN,确保逻辑正确:
WITH display_name_fid AS ( SELECT fid FROM field WHERE name = 'DisplayName' AND sid = 8 ), index_clid AS ( SELECT clid FROM class WHERE name = 'Index' ), ids AS ( SELECT id FROM SVAL WHERE fid IN (SELECT fid FROM display_name_fid) AND val IN ('bchm30p') ) SELECT ident FROM id WHERE id IN (SELECT id FROM ids) AND clid IN (SELECT clid FROM index_clid);
内容的提问来源于stack exchange,提问作者dfbhuj
相关产品推荐
相关产品推荐

