Я пытаюсь выполнить LEFT OUTER JOIN
при фильтрации в правой части соединения.
Для этого я создал следующий индекс:
CREATE INDEX `idx_store_order` ON `myBucket`(("Store::" || `storeId`)) WHERE ((`docType` = "Order") or (`docType` is missing))
и я пытаюсь выполнить следующий запрос:
SELECT store.status, order.clientId, store.docId
FROM myBucket store
LEFT OUTER JOIN myBucket order ON KEY ("Store::" || order.storeId) FOR store
WHERE store.docType="Store"
AND (order.docType="Order" OR order.docType IS MISSING)
AND order.clientId="9281ae36-a418-4ea3-93f0-bfd7b1a38248"
У меня есть 30 документов с docType="Store"
, но когда я выполняю этот запрос, я не получаю 30 результатов. Если я удалю последнее предложение и сгруппирую по хранилищу, я получу 30 результатов, так что последнее предложение влияет на окончательные результаты.
Я также пробовал следующее утверждение (безуспешно) в качестве последнего предложения:
(AND order.clientId="9281ae36-a418-4ea3-93f0-bfd7b1a38248" OR order.docType IS MISSING)
Я что-то упускаю? Спасибо
ИЗМЕНИТЬ Вот запрос с объяснением:
[
{
"plan": {
"#operator": "Sequence",
"~children": [
{
"#operator": "IndexScan",
"index": "idx_docType",
"index_id": "e498d0c0ee2f0d9d",
"keyspace": "myBucket",
"namespace": "default",
"spans": [
{
"Range": {
"High": [
"\"Store\""
],
"Inclusion": 3,
"Low": [
"\"Store\""
]
}
}
],
"using": "gsi"
},
{
"#operator": "Parallel",
"~child": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Fetch",
"as": "store",
"keyspace": "myBucket",
"namespace": "default"
},
{
"#operator": "IndexJoin",
"as": "order",
"for": "store",
"keyspace": "myBucket",
"namespace": "default",
"on_key": "(\"Store::\" || (`order`.`storeId`))",
"outer": true,
"scan": {
"index": "idx_store_order",
"index_id": "a97fce5158e6e573",
"using": "gsi"
}
},
{
"#operator": "Filter",
"condition": "((((`store`.`docType`) = \"Store\") and (((`order`.`docType`) = \"Order\") or ((`order`.`docType`) is missing))) and (((`order`.`clientId`) = \"9281ae36-a418-4ea3-93f0-bfd7b1a138248\") or (`order` is missing)))"
},
{
"#operator": "InitialProject",
"result_terms": [
{
"expr": "(`store`.`status`)"
}
]
},
{
"#operator": "FinalProject"
}
]
}
}
]
},
"text": "SELECT store.status\nFROM myBucket store\nLEFT OUTER JOIN myBucket order ON KEY (\"Store::\" || order.storeId) FOR store\nWHERE store.docType=\"Store\"\nAND (order.docType=\"Order\" OR order.docType IS MISSING)\nAND (order.clientId=\"9281ae36-a418-4ea3-93f0-bfd7b1a138248\" OR order IS MISSING)"
}
]
РЕДАКТИРОВАТЬ2
Как обсуждалось в комментариях, я хочу перечислить все магазины, независимо от того, есть ли у данного покупателя заказы или нет. Если у покупателя есть заказы, я хочу показать определенные поля вместе со списком магазинов.
Например Магазин 1 - у клиента X нет заказов Магазин 2 - у клиента X есть один заказ, и некоторая информация отображается в информации о магазине
SELECT count(*) FROM myBucket WHERE clientId="9281ae36-a418-4ea3-93f0-bfd7b1a38248"
. Результат больше 1? - person quest4truth   schedule 11.01.2017