【问题标题】:RelNode of a query in which FROM clause itself has a queryFROM 子句本身有查询的查询的 RelNode
【发布时间】:2021-01-30 00:59:51
【问题描述】:

我想从一个表中获得结果,其中我 ORDER BYid 并且我不希望 id 出现在结果中。我可以使用以下查询来实现这一点。

SELECT COALESCE (col1, '**')
FROM (select col1, id FROM myDataSet.myTable WHERE col4 = 'some filter' ORDER BY id);

现在,我想为上述查询创建一个 RelNode。据我所知,在方解石中,要执行表扫描,只有scan(String tableName)scan(Iterable<String> tableNames) 两种方法。有没有办法scan(RelNode ) ?如何做到这一点?

【问题讨论】:

    标签: apache-calcite


    【解决方案1】:

    只需简单地创建一个内部子查询的 RelNode 并在其上创建另一个投影。像这样。

    builder.scan('myTable')
     .filter(builder.call(SqlStdOperator.EQUALS, builder.field(col4), builder.literal('some filter') )))
      .project(builder.field('col1'), builder.field('id'))
      .sort(builder.field('id'))
      .project(builder.call(SqlStdOperator.COALESCE(builder.field('col1'), builder.literal('**'))))
      .build()
    
    

    【讨论】:

      【解决方案2】:

      查询

      select col1, col2, col2 FROM myDataSet.myTable WHERE col4 = 'some filter' ORDER BY id
      

      应该也会给你想要的结果。

      如果您想更直接地表示您编写的查询,您可以首先在 from 子句中为查询构造一个 RelNode,从扫描 myDataSet.myTable 开始,添加过滤器和顺序。然后,您可以投影所需的特定列集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 2011-11-08
        相关资源
        最近更新 更多