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

选择和遍历的结果不同?

  •  1
  • Ryan  · 技术社区  · 11 年前

    我正在使用OrientDb和示例车辆历史数据库进行试验,并执行了这两个SQL查询,我(本以为)这两个查询是相同的。我正在寻找所有向男性出售车辆的女性。

    SELECT expand(out('Bought').in('Sold')[gender="Female"]) FROM Person 
      WHERE gender = "Male" LIMIT = -1
    

    这一条返回124条记录。

    虽然

    SELECT FROM ( TRAVERSE in('Sold') FROM (   
      SELECT FROM ( TRAVERSE out('Bought') FROM ( 
        SELECT FROM Person WHERE gender = "Male")
      ) WHERE @class = "Transaction" )) 
    WHERE @class = "Person" and gender = "Female" LIMIT = -1
    

    返回117条记录。

    我希望有人能给我解释一下有什么不同?

    2 回复  |  直到 11 年前
        1
  •  2
  •   codemix    11 年前

    我们在gitter上解决了这个问题,但对于其他人来说,这是因为第二个查询会删除重复项(因为遍历),而第一个查询不会。

        2
  •  1
  •   Lvca    11 年前

    @codemix是正确的,要获得相同的结果,请使用set()排除重复:

    SELECT FROM (
      TRAVERSE in('Sold') FROM (   
        SELECT FROM (
          TRAVERSE set( out('Bought') ) FROM ( 
            SELECT FROM Person WHERE gender = "Male"
          )
        ) WHERE @class = "Transaction"
      )
    ) 
    WHERE @class = "Person" and gender = "Female" LIMIT = -1