Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join 数据库中的自连接_Join_Rethinkdb_Rethinkdb Javascript - Fatal编程技术网

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”)