N1QL обновить документ с подзапросом - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь денормализовать документ «Страна» с полем «regionName», соответствующим «имени» другого документа «Region». Мой N1QL-запрос, как показано ниже, но он не работает

update test as t1 set regionName = (
 select raw name from test as t2 where `_class`="Region"
) where `_class`="Country" and t1.regionCode=t2.code RETURNING *;

Любая помощь?

1 Ответ

2 голосов
/ 03 мая 2020

N1QL не имеет ОБЪЕДИНЕННЫХ ОБЪЕДИНЕНИЙ. Вы не можете ИСПОЛЬЗОВАТЬ источник подзапроса SET CLAUSE в предложении UPDATE WHERE.

Использовать слияние

MERGE test AS m 
USING test AS s
ON s.`_class`="Region" AND m.`_class`="Country" AND m.regionCode=s.code
WHEN MATCHED THEN m.regionName = s.name;

https://blog.couchbase.com/ansi-join-enhancements-and-ansi-merge/

CB 6.0

MERGE test AS m 
USING  (SELECT META(c).id, r.name
        FROM test AS r
        JOIN test AS c 
        ON r.`_class`="Region" AND c.`_class`="Country" 
           AND r.regionCode = c.code) AS s
ON KEY s.id
WHEN MATCHED THEN m.regionName = s.name;
...