Join 数据库中的自连接
我在数据库中有一个如下表(实现树结构):Join 数据库中的自连接,join,rethinkdb,rethinkdb-javascript,Join,Rethinkdb,Rethinkdb Javascript,我在数据库中有一个如下表(实现树结构): id label parent 1 Node 1 2 Node 2 1 3 Node 3 1 4 Node 4 2 我想编写一个查询,提供以下输出: id label parent 1 Node 1 2 Node 2 Node 1 3 Node 3 Node 1 4 Node 4 Node 2 为此,我写了以下内容: r.db(
id label parent
1 Node 1
2 Node 2 1
3 Node 3 1
4 Node 4 2
我想编写一个查询,提供以下输出:
id label parent
1 Node 1
2 Node 2 Node 1
3 Node 3 Node 1
4 Node 4 Node 2
为此,我写了以下内容:
r.db("exampleDB").table("exampleTable").eqJoin("parent", r.db("exampleDB").table("exampleTable")).merge(function(val) {
return {
"left": {
"parent": val("right")("label")
}
}
}).without({
"right": true
}).zip()
此查询返回除根节点以外的所有行。我如何做到这一点?我还想知道这是否是最有效的方法,因为我可能还必须在非常复杂的场景中做到这一点。您可以使用内部联接进行一些修改:
r.db("exampleDB").table("exampleTable").innerJoin(r.db("exampleDB").table("exampleTable"), function(left, right){
// if parent is not empty join by parent <--> id
return left("parent").eq(right("id"))
// or if parent is empty
.or( left("parent").eq("").and(left("id").eq(right("id"))))
}).merge(function(val) {
return {
"left": {
"parent": r.branch(
// if row parent field is empty
val("left")("parent").eq(""),
// just return empty string
"",
// otherwise get label field of parent
val("right")("label")
)
}
}
}).without({
"right": true
}).zip().orderBy("id")
r.db(“exampleDB”).table(“exampleTable”).innerJoin(r.db(“exampleDB”).table(“exampleTable”)、函数(左、右){
//如果父项不是空的,则按父项id联接
返回左侧(“父”).eq(右侧(“id”))
//或者如果父项为空
.或(左(“父”).eq(“”)和(左(“id”).eq(右(“id”))
}).merge(函数(val){
返回{
“左”:{
“家长”:r.branch(
//如果行父字段为空
val(“左”)(“父”).eq(“”),
//只需返回空字符串
"",
//否则获取父项的标签字段
val(“右”)(“标签”)
)
}
}
}).没有({
“正确”:正确
}).zip().orderBy(“id”)
您可以使用内部联接进行一些修改:
r.db("exampleDB").table("exampleTable").innerJoin(r.db("exampleDB").table("exampleTable"), function(left, right){
// if parent is not empty join by parent <--> id
return left("parent").eq(right("id"))
// or if parent is empty
.or( left("parent").eq("").and(left("id").eq(right("id"))))
}).merge(function(val) {
return {
"left": {
"parent": r.branch(
// if row parent field is empty
val("left")("parent").eq(""),
// just return empty string
"",
// otherwise get label field of parent
val("right")("label")
)
}
}
}).without({
"right": true
}).zip().orderBy("id")
r.db(“exampleDB”).table(“exampleTable”).innerJoin(r.db(“exampleDB”).table(“exampleTable”)、函数(左、右){
//如果父项不是空的,则按父项id联接
返回左侧(“父”).eq(右侧(“id”))
//或者如果父项为空
.或(左(“父”).eq(“”)和(左(“id”).eq(右(“id”))
}).merge(函数(val){
返回{
“左”:{
“家长”:r.branch(
//如果行父字段为空
val(“左”)(“父”).eq(“”),
//只需返回空字符串
"",
//否则获取父项的标签字段
val(“右”)(“标签”)
)
}
}
}).没有({
“正确”:正确
}).zip().orderBy(“id”)