OreintDb Select Query IN Operator filter with traverse Subquery не работает
Я пытаюсь использовать запрос Traverse в подзапросе, чтобы получить отфильтрованные данные для вершины, но не могу получить данные, пожалуйста, найдите следующие шаги для настройки вершины
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
Вставка данных клиента Vertex
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, следуя приведенной ниже структуре.
All Territories
United States (sub territory of All territory)
East Coast (sub territory of United states)
West Coast (sub territory of United states)
Обновите записи согласно приведенным ниже сценариям.
- Добавить США избавиться в в списке всех территорий subTerritories
- Добавить East Coast и West Coast РИД в в списке subsTerritories Соединенных Штатов Отчета
- Добавьте территорию восточного побережья, чтобы избавиться от 2-х записей клиентов, а территорию территорий на западном побережье - в оставшуюся единую запись.
Теперь согласно нашему требованию
- если клиенты отфильтрованы по идентификатору территории восточного побережья, мы должны получить 2 клиента
- если клиент отфильтрован по идентификатору территории США, он должен возвращать данные клиентов как восточного, так и западного побережья.
поэтому для получения списка территорий Rid мы используем запрос traverse, например, если вы передадите территорию Соединенных Штатов в запросе ниже, он вернет 3 записи в соответствии с настройкой данных выше, то есть данными США, восточного и западного побережья. Синтаксис:
SELECT @rid FROM (TRAVERSE subTerritories FROM <UNITED_STATES_TERRITORY_RID>)
например
SELECT @rid FROM (TRAVERSE subTerritories FROM #23:0)
этот запрос нам нужно использовать в качестве подзапроса для фильтрации записей клиентов
Если мы попробуем выполнить обычный запрос клиента с In Operator и указанным идентификатором территории, мы получим данные клиента
WHERE territories.@rid IN [#24:0]
но вместо жестко заданного идентификатора территории нам нужен запрос прохождения в качестве подзапроса для получения идентификаторов записей территорий.
Synatx: клиент
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 записи о клиенте, поскольку клиенты восточного побережья находятся на территории Соединенных Штатов.
какие-либо предложения по улучшениям вышеупомянутого подзапроса?
1 ответ
Необходимо использовать методы SQL OrientDB (
asList()
в данном случае) в подзапросе.
SELECT FROM customer WHERE territories IN (SELECT @rid.asList() FROM (TRAVERSE subTerritories FROM [#65:0,#66:0]))