如何移除SELECT语句中的子查询以适配Denodo/VQL语法要求?
操作可行性结论
完全可以实现SELECT子句的子查询移除,适配Denodo/VQL的语法规则。以下是两种和原查询逻辑完全等价的改写方案:
方案1:FROM子句子查询+左关联实现
该方案将匹配逻辑放到FROM子句的子查询中,符合Denodo/VQL的语法要求,性能表现更优:
SELECT CASE WHEN match_mat.material IS NOT NULL THEN 'Found' ELSE 'Not Found' END FROM schema.material_table main LEFT JOIN ( SELECT DISTINCT material FROM schema.material_table WHERE old_material LIKE '%55AD%' ) match_mat ON main.material = match_mat.material;
小提示:如果material是material_table的唯一值字段,可去掉子查询中的DISTINCT进一步提升效率
方案2:CTE(WITH语法)实现
如果你偏好可读性更强的写法,可使用Denodo/VQL支持的CTE语法提前定义匹配集合,再做关联:
WITH matched_material AS ( SELECT DISTINCT material FROM schema.material_table WHERE old_material LIKE '%55AD%' ) SELECT CASE WHEN m.material IS NOT NULL THEN 'Found' ELSE 'Not Found' END FROM schema.material_table main LEFT JOIN matched_material m ON main.material = m.material;
以上两种方案均不存在SELECT子句内的子查询,可直接在Denodo/VQL中运行,返回结果和原SQL完全一致。
内容的提问来源于stack exchange,提问作者ccny18
相关产品推荐
相关产品推荐

