开发者社区> 问答> 正文

解析with......insert overwrite......类sql问题

使用visitor遍历sql的SQLExprTableSource,发现vistitor在遍历类似 wtih......insert overwrite......这种类型的sql时,不会遍历with里的表,而with......select 则不会出现这种情况。

visitor定义如下:

public static class TableVisitor extends OdpsASTVisitorAdapter {

public List<String> tableList = new ArrayList<>();

@Override
public boolean visit(SQLExprTableSource tableSource) {
    tableList.add(tableSource.getTableName());
    return true;
}

}

遍历代码如下:

String sql1 = "with \n" + " a as (select * from src where key is not null),\n" + " b as (select * from src2 where value>0),\n" + " c as (select * from src3 where value>0),\n" + " d as (select a.key,b.value from a join b on a.key=b.key ),\n" + " e as (select a.key,c.value from a left outer join c on a.key=c.key and c.key is not null )\n" + " insert overwrite table x select * from y;";

SQLStatement statement = SQLUtils.parseSingleStatement(sql1, DbType.odps, false); TableVisitor visitor = new TableVisitor(); statement.accept(visitor); System.out.println(visitor.tableList.toString());

打印结果: [x, y]

原提问者GitHub用户debughx

展开
收起
山海行 2023-07-05 17:59:55 87 0
2 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    WITH...INSERT OVERWRITE... 是一种常用的 SQL 查询语句,它可以将查询结果插入到指定的表中,并覆盖原有的数据。
    WITH 子句用于定义一个临时表或子查询,可以在查询语句中多次使用,以提高查询效率和可读性。而 INSERT OVERWRITE 则表示将查询结果覆盖写入指定的表中,这可能会导致原有数据的丢失,需要谨慎使用。

    2023-07-30 21:19:35
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.14

    原回答者GitHub用户wenshao

    2023-07-06 10:42:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载
从理论到实践,深度解析MySQL Group Replication 立即下载

相关镜像