正在解析 SQL - 来自 table select 的所有 Teradata 关键字

parsing SQL - allTeradata keywords that select from a table

我正在尝试快速解析许多 sql 脚本以确定正在使用的源表和视图。 这个想法是搜索 "FROM" 并获取以下单词。 我知道这也可能导致子查询,但最终也会有一个 "FROM"。

备选方案是连接 dbc 表,但这会让我们快速浏览一下。

我应该寻找哪些关键字? JOIN 和 FROM 是我目前唯一能想到的。 还有更多关键字吗?

谢谢

查看现有解析器的源代码:

我在看 jOOQ's parser's sources。它至少可以在这些上下文中解析 tables:

SELECT 语句:

  • FROM(注意,这里有一个逗号分隔的列表:FROM a, b, c 是完全可能的)
  • (LEFT, RIGHT, FULL, CROSS) (NATURAL) (INNER, OUTER) JOIN

注意事项:

  • Table中的引用FROM可以导出tables
  • Table FROM 中的引用可以是常见的 table 表达式(来自 WITH 子句)

插入语句:

  • INTO(尽管在 Teradata 中它是可选的)
  • INSERTINS(Teradata 支持 INS 作为 INSERT 的别名)

更新语句:

  • UPDATEUPD(Teradata 支持 UPD 作为 UPDATE 的别名)

DELETE 语句:

  • FROM(但关键字是可选的)
  • DELETEDEL(Teradata 支持 DEL 作为 DELETE 的别名)

MERGE 语句:

  • INTO(可选)
  • MERGE
  • USING

DDL 语句:

不要忘记这些:

  • TRUNCATE (TABLE)
  • CREATE TABLE
  • CREATE VIEW
  • ALTER TABLE
  • ALTER VIEW
  • DROP TABLE
  • DROP VIEW
  • COMMENT ON TABLE
  • COMMENT ON VIEW
  • CREATE INDEXON 子句)
  • GRANTONON TABLE 子句)
  • REVOKEFROMFROM TABLE 子句)

使用现有的解析器编写脚本:

如果使用 Java 是一个选项,那么您可以使用 jOOQ's parser, run all scripts through it, re-generate the SQL and plug in a VisitListener 来收集所有 table。像这样:

DSLContext ctx = DSL.using(SQLDialect.TERADATA);
ctx.configuration().set(new DefaultVisitListener() {
    @Override
    public void visitStart(VisitContext ctx) {
        if (ctx.queryPart() instanceof Table)
            System.out.println(ctx.queryPart());
    }
});

// The toString() call will trigger a re-generation which passes through the VisitListener
ctx.parser().parse(allSQL).toString();

虽然 jOOQ 需要 TERADATA 的商业许可,但您可以使用免费的开源版来完成此特定任务,因为开源版的解析器几乎支持所有语法。

免责声明:我在 jOOQ 背后的公司工作。

您可以使用内置机制 SHOW (QUALIFIED):

Use the QUALIFIED option to produce a report that resolves the ambiguous dependencies.

SHOW QUALIFIED SELECT * FROM view_name;

这样您将获得包含视图相关性的报告。然后您可以根据该报告去除 table 名称。