代码之家  ›  专栏  ›  技术社区  ›  user1595077

N1QL(Couchbase)-Couchbase中不存在关系的真正左连接

  •  0
  • user1595077  · 技术社区  · 7 年前

    为了简单起见,假设我有以下DB:

    {
        id: "a_id",   // This is the key, not a field in the document
        type: "a"
    }
    {
        id: "b_id",
        type: "b",
        a: "a_id"
    }
    {
         type: "c",
         b: "b_id"
    }
    

    正如你所看到的,有一种典型的亲子关系(“a”有许多“b”,“b”有许多“c”) 让我们假设并不总是有一个“c”类型的文档——例如,我有五个“b”文档,但只有一个文档有一个与之相关的“c”文档。 我想写一个连接查询,它会给我所有属于“a”的“b”,如果它们存在的话-所有属于“b”的“c”,但对于没有“c”的“b”文档,我不会得到任何结果-我想得到所有五个“b”文档,以及一个相关的“c”文档。 我的查询如下所示:

    SELECT *
    FROM default AS a
    JOIN default AS b ON KEY b.a FOR a
    JOIN default AS c ON KEY c.b FOR b
    WHERE a.type = "a"
    AND b.type = "b"
    AND c.type = "c";
    

    谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   vsr    7 年前

    如果缺少c,则WHERE子句post join filter。c.type=c为false。

    INSERT INTO default VALUES("a_id", { "type": "a" });
    INSERT INTO default VALUES("b_id", { "type": "b", "a":"a_id"});
    INSERT INTO default VALUES("b_id1", { "type": "b", "a":"a_id"});
    INSERT INTO default VALUES("b_id1", { "type": "b", "a":"a_id"});
    INSERT INTO default VALUES("b_id2", { "type": "b", "a":"a_id"});
    INSERT INTO default VALUES("b_id3", { "type": "b", "a":"a_id"});
    INSERT INTO default VALUES("b_id4", { "type": "b", "a":"a_id"});
    INSERT INTO default VALUES("c_id", { "type": "c", "b":"b_id"});
    
    CREATE INDEX ia ON default(a);
    CREATE INDEX ib ON default(b);
    
    SELECT *
    FROM default AS d
    LEFT JOIN default AS d1 ON KEY d1.a FOR d
    LEFT JOIN default AS d2 ON KEY d2.b FOR d1
    WHERE d.type = "a"
    AND d1.type = "b"
    AND (d2 IS MISSING OR d2.type = "c");
    

    https://dzone.com/articles/visually-explaining-n1ql-joins