1

使用 JSqlParser 解析查询时,在某些情况下,JSqlParser 似乎决定将 SubJoin 对象生成为 FromItem,而不是常规的 Table / Join 对象。

您能帮我了解它何时发生以及为什么发生吗?它们之间的主要区别是什么?它与决定顺序的括号有关吗?

让解析器创建 SubJoin 对象的示例:

SELECT 
    test
FROM
    ((tbl1
    LEFT JOIN tbl2 ON ((tbl1.id = tbl2.id)))
    LEFT JOIN tbl3 ON ((tbl1.id = tbl3.id)))

让库仅创建连接对象的示例:

SELECT 
    test
FROM
    tbl1
        LEFT JOIN
    tbl2 ON tbl1.id = tbl2.id
        LEFT JOIN
    tbl3 ON tbl1.id = tbl3.id;
4

1 回答 1

2

如果您的 from - 部分中有括号,则会创建一个SubJoin :

FROM
    ((tbl1
    LEFT JOIN tbl2 ON ((tbl1.id = tbl2.id)))
    LEFT JOIN tbl3 ON ((tbl1.id = tbl3.id)))

您可以将 SubJoin 理解来自Item + JoinExpression - 构造的更深层次的层次结构。所以如果你愿意的话, SubJoin本身就是括号。

如果你都是访客,那么应该没有问题。使用 >0.9 的 JSqlParser 版本,有访问者的适配器类,例如ExpressionVisitorAdapter,这是所需访问者的标准实现。

于 2018-01-25T08:16:44.160 回答