首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在orientdb语句中使用let块

在orientdb语句中使用let块
EN

Stack Overflow用户
提问于 2015-10-27 16:07:48
回答 2查看 1.2K关注 0票数 2

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

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

代码语言:javascript
复制
select from Person where ident = 1

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

代码语言:javascript
复制
select from Person where name = 'Bob'

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2015-10-29 07:18:49

$tmp将是一个记录列表,所以您要求将一个字符串与一个列表进行比较,但它不起作用。你可以做以下的事情;

代码语言:javascript
复制
select name from Person
  let $tmp = (select from Person where ident = 1)
  where name = first($tmp).name

但是,它不会返回Person记录(只返回行名称)。限制$tmp查询也会稍微提高性能。因此,以下几点更好;

代码语言:javascript
复制
select from Person
  let $tmp = (select from Person where ident = 1 limit 1)
  where name = first($tmp).name

但实际上,以这种方式使用let子句是不好的。文档

LET块包含每次计算记录时要分配的上下文变量列表。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-10-30 15:16:40

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

代码语言:javascript
复制
select name from Person
  let $tmp = (select name from Person where ident = 1)
  where name in $tmp

或者如果$tmp包含名称

代码语言:javascript
复制
select name from Person
  let $tmp = (select name from Person where ident = 1)
  where $tmp contains name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33372929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档