0

我正在尝试在子查询中使用遍历查询来获取顶点的过滤数据,但无法检索数据请查找以下顶点设置步骤

CREATE CLASS Territory IF NOT EXISTS EXTENDS V
CREATE PROPERTY Territory.name IF NOT EXISTS STRING (MANDATORY TRUE)
CREATE PROPERTY Territory.subTerritories IF NOT EXISTS LINKLIST Territory

CREATE CLASS Customer IF NOT EXISTS EXTENDS V
CREATE PROPERTY Customer.CustomerNo IF NOT EXISTS STRING (MANDATORY TRUE, NOTNULL TRUE)
CREATE PROPERTY Customer.territories IF NOT EXISTS LINKLIST Territory

客户顶点数据插入 INSERT INTO CUSTOMER (CustomerNo, territories) VALUES ("Cust_1", []), ("Cust_2", []), ("Cust_3", [])

区域顶点数据插入 INSERT INTO Territory (name, subTerritories) VALUES ("All Territories", []), ("United States", []), ("East Coast", []), ("West Coast", [])

然后首先通过更新其 subTerritories 属性值来更新 Territories 记录,遵循以下结构

  All Territories 
    United States (sub territory of All territory)
        East Coast  (sub territory of United states) 
        West Coast  (sub territory of United states)

根据以下场景更新记录

  1. United States rid添加 All Territories subTerritories列表
  2. East Coast 和 West Coast rid's添加 United States Record的subsTerritories 列表中
  3. 东海岸地区摆脱添加到 2 个客户记录地区财产和西海岸地区到剩余的单一记录

现在按照我们的要求

  • 如果客户被东海岸地区 id 过滤,那么我们应该得到 2 个客户
  • 如果客户按美国领土 ID 过滤,则它应返回东海岸和西海岸客户数据

因此,为了获取领土排除列表,我们使用遍历查询,例如,如果您在下面的查询中通过美国领土排除,那么它将根据上述数据设置返回 3 条记录,即美国、东海岸和西海岸数据 语法: SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>) 例如 SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0)

我们需要将此查询用作过滤客户记录的子查询

如果我们尝试使用 In Operator 和提到的区域 id 进行普通客户查询,那么我们将获得数据 select * from 客户 WHERE territories.@rid IN [#24:0]

但是我们需要遍历查询作为子查询来获取区域记录 ID,而不是硬编码的区域 ID

Synatx: select * from 客户, WHERE territories IN (SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>)) 例如 select * from 顾客 WHERE territories IN (SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0))

但是通过这个查询,我们没有得到单个客户记录,因为它应该返回 3 个客户记录,因为东海岸客户在美国领土下

对上述子查询改进有什么建议吗?

4

1 回答 1

0

Needed to use the OrientDB SQL methods (asList() in this case) in the subquery.

SELECT FROM customer WHERE territories IN (SELECT @rid.asList() FROM (TRAVERSE subTerritories FROM [#65:0,#66:0]))
于 2021-09-03T04:26:00.830 回答