在orientdb select语句中使用let块

时间:2015-10-27 16:07:48

标签: orientdb

希望快点 - 我正在努力让一个let语句工作。

我有一个人员顶点数据库。顶点具有ident字段和名称字段。此查询返回一行 - 名为Bob的人。

select from Person where ident = 1

我想返回与此人姓名相同的所有行。数据中有两个Bobs(作为证据,以下查询返回两行):

select from Person where name = 'Bob'

我认为以下所有查询都应返回相同的两行,但它们都返回0行。它们都涉及使用let语句的不同方式。谁能看到我做错了什么?

select name from Person
  let $tmp = (select from Person where ident = 1)
  where name = $tmp.name

select name from Person
  let $tmp = (select name from Person where ident = 1)
  where name = $tmp

select name from Person
  let $tmp = 'Bob'
  where name = $tmp

2 个答案:

答案 0 :(得分:1)

$ tmp将是一个记录列表,因此您要求将字符串与列表进行比较,但它不起作用。您可以执行以下操作;

select name from Person
  let $tmp = (select from Person where ident = 1)
  where name = first($tmp).name

虽然不会返回Person记录(只有名称行)。限制$ tmp查询也会略微提高性能。所以以下是更好的;

select from Person
  let $tmp = (select from Person where ident = 1 limit 1)
  where name = first($tmp).name

但实际上,以这种方式使用let子句并不好。 docs

  

LET块包含要为每个变量分配的上下文变量列表   评估记录的时间。

所以完全重新排列查询是*(*应该)更好;

select expand($persons_with_name) let
$person_with_ident = first((select from Person where ident = 1 limit 1)),
$persons_with_name = (select from Person where name = $parent.$person_with_ident.name)

答案 1 :(得分:0)

您可以查看名称是否包含在$ tmp

select name from Person
  let $tmp = (select name from Person where ident = 1)
  where name in $tmp

或$ tmp包含名称

select name from Person
  let $tmp = (select name from Person where ident = 1)
  where $tmp contains name