实现JOIN重写以允许将子查询的结果提供给查询的正确方法是什么? 例如:
SELECT state FROM zips_view WHERE j IN (select j from people_view)
此查询被重写为SemiJoin,SemiJoin执行表扫描内部查询(按预期再次选择_people_view_),然后再次表扫描进行外部查询(针对_zips_view_选择)。第二次扫描可以替换为过滤查询,例如
SELECT state FROM zips_iew WHERE j IN (1,2,3,4)
实现“两阶段” JOIN并接收子查询结果并将其作为过滤器/条件添加到外部查询的正确方法是什么?
答案 0 :(得分: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),然后逐步研究以获得上面所示的关系代数。