V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
so2back
V2EX  ›  数据库

请教一个 sql 中字段血缘和字段加工口径获取的问题

  •  
  •   so2back · 10 天前 · 697 次点击

    接到一个预研的需求,需要获取一段 sql 中某个结果字段的加工口径 sql ,具体的做法就是裁剪掉所有无关的子 sql 。例如以下这段 sql:

    SELECT
    	t3.level,
    	t4.level_name,
    	sum( t2.salary ) AS salary 
    FROM
    	t1
    	INNER JOIN t2 ON t1.id = t2.id
    	INNER JOIN t3 ON t2.id = t3.id
    	INNER JOIN t4 ON t4.level = t3.level 
    WHERE
    	t1.age > 50 
    GROUP BY
    	t3.level;
    

    针对 salary 结果字段,裁剪后的 sql 应该为(去掉了 t4 表的影响):

    SELECT sum( t2.salary ) AS salary 
    FROM t1
    INNER JOIN t2 ON t1.id = t2.id
    INNER JOIN t3 ON t2.id = t3.id
    WHERE
    	t1.age > 50 
    GROUP BY
    	t3.level;
    

    请问下有什么思路或者开源的工具/框架可以做到这一点的吗? 以前没有怎么做过 sql 解析这块,现在了解到的有 Apache Calcite 和 ANTLR 这两个东西,有什么开源项目是基于这两个做二开后的,想学习下,时间太紧查到的东西有限,有点下不去手

    6 条回复    2025-02-11 17:02:07 +08:00
    MoYi123
        1
    MoYi123  
       9 天前
    据我了解是没这种东西的.
    建议是先找产品砍掉这个需求, 实在不行就直接在 select list 里去掉不需要的, 然后相信优化器.
    so2back
        2
    so2back  
    OP
       9 天前
    @MoYi123 #1 哎难搞,感觉得基于 Calcite 或者 ANTLR 做二次开发,但 sql 本身就可以很复杂,要考虑的是真多,为难我一个菜鸡了
    catamaran
        3
    catamaran  
       9 天前
    一个一个看呗,从 select 入手,从需要的表开始捋,不需要的嘎掉,时间不够就申请延长时间。
    oldManNewThought
        4
    oldManNewThought  
       9 天前
    试试 sqlparser,就是 mybatis-plus 内部依赖的一个库
    so2back
        5
    so2back  
    OP
       9 天前
    @oldManNewThought #4 好的谢谢,我去看看
    smplesugar
        6
    smplesugar  
       9 天前
    挺有意思的 mark 一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 11:26 · PVG 19:26 · LAX 03:26 · JFK 06:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.