【问题标题】:Self join in rethinkdb自我加入 rethinkdb
【发布时间】:2015-07-29 19:49:05
【问题描述】:

我在rethinkdb中有如下表(实现树形结构):

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

此查询返回除根节点之外的所有行。我如何得到它,而且我想知道这是否是最有效的方法,因为我可能也必须在非常复杂的情况下这样做。

【问题讨论】:

    标签: join rethinkdb rethinkdb-javascript


    【解决方案1】:

    您可以使用内部联接进行一些修改:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-23
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多