我有两个表A
和B
我想在sql中使用left join
,这意味着A的所有内容,只有B的常见内容。
我尝试使用外连接,如:
r.table("A").outerJoin(r.table("B"),function(a,b){
return a("id")==b("anotherfield")("joinfield")
})
但由于表B
中没有索引,因此查询非常慢。
查询outerjoin
时如何使用二级索引?
等效sql
select * from A
left join a.id = b.other_field_join
答案 0 :(得分:1)
您可以在此处执行map
:
r.table('a').map(function(row) {
return {left_row: row, right_rows: r.table('b').getAll(row('id'), {index:'idx'})};
})
答案 1 :(得分:1)
我花了很多时间尝试使用 concatMap 而不是 outerJoin 来加快结果
此处提供的示例:
https://rethinkdb.com/docs/sql-to-reql/javascript/
但是那个投掷错误:
Expected type DATUM but found SELECTION
由于执行操作而发生这种情况只需要基本数据类型而非选择结果
与我合作的解决方案:
r.table("A")
.concatMap(function(rowA) {
.getAll(rowA("other_field_join"), {index: 'other_field_join'})
.coerceTo('array')
.do(function (result) {
return r.branch(
result.count().eq(0)
, [{left: tableA}],
result.map(function (rowB) {
return {
left:rowA, right: rowB
};
})
)
})
})
答案 2 :(得分:0)
如果要将SELECTION更改为DATUM,请更改以下
right_rows: r.table('b').getAll(row('id').coerceTo('ARRAY')
但是你打算一个人加入吗?
如果是ONE TO ONE JOIN,只需添加二级索引即可更快地获得结果。
r.table("B").indexCreate("anotherfield")
r.table("A").outerJoin(r.table("B"), function(left, right) {
return left("id").eq(right("anotherfield"));
})