我正在尝试在子查询中使用遍历查询来获取顶点的过滤数据,但无法检索数据请查找以下顶点设置步骤
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)
根据以下场景更新记录
- 将United States rid添加 到All Territories subTerritories列表
- 将East Coast 和 West Coast rid's添加 到United States Record的subsTerritories 列表中
- 将东海岸地区摆脱添加到 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 个客户记录,因为东海岸客户在美国领土下
对上述子查询改进有什么建议吗?