希望快点 - 我正在努力让一个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
答案 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