在orientdb select语句中使用let块

在orientdb select语句中使用let块,orientdb,Orientdb,希望是一个快速的-我正在努力使一个让声明工作 我有一个关于人的顶点的数据库。顶点有ident字段和name字段。此查询返回一行-一个名为Bob的人 select from Person where ident = 1 我想返回与此人同名的所有行。数据中有两个BOB(作为证明,以下查询返回两行): 我认为以下所有查询都应该返回相同的两行,但它们都返回0行。它们都涉及使用let语句的不同方式。有人能看出我做错了什么吗 select name from Person let $tmp = (se

希望是一个快速的-我正在努力使一个让声明工作

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

select from Person where ident = 1
我想返回与此人同名的所有行。数据中有两个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

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

select name from Person
  let $tmp = (select from Person where ident = 1)
  where name = first($tmp).name
但它不会返回个人记录(仅返回姓名行)。限制$tmp查询也会略微提高性能。因此,以下是更好的

select from Person
  let $tmp = (select from Person where ident = 1 limit 1)
  where name = first($tmp).name
但实际上,以这种方式使用let子句是不好的。说

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)

您可以查看$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
select name from Person
  let $tmp = (select name from Person where ident = 1)
  where $tmp contains name