0

实现 JOIN 重写以允许向查询提供子查询结果的正确方法是什么?例如:

SELECT state  FROM zips_view WHERE j IN (select j from people_view)

该查询被重写为 SemiJoin,它执行表扫描内部查询(按预期再次选择 _people_view_),然后再次对外部查询进行表扫描(选择 _zips_view_)。第二次扫描可以替换为过滤查询,例如

SELECT state FROM zips_iew WHERE j IN (1,2,3,4)

什么是实现“两阶段”JOIN 的正确方法,它获取子查询的结果并将它们作为过滤器/条件添加到外部查询?

4

1 回答 1

0

我在这里使用 JDBC 连接器,对于您想要的查询:

SELECT state FROM zips_iew WHERE j IN (1,2,3,4)

它生成这个关系代数:

LogicalProject(state=[$0])
  LogicalFilter(condition=[OR(=($0, 1), =($0, 2), =($0, 3), =($0, 4))])
    JdbcTableScan(table=[[zips_iew, state]])

您应该首先编写规则来转换您的原始关系代数(使用 SemiJoin),然后逐步获得如上所示的关系代数。

于 2019-05-16T09:54:26.520 回答