couchbase - N1QL (CB6.6) ANSI 合并
问题描述
我正在尝试从 ":ao.mos:pro:%" 获取客户 ID 并更新相应的文档 ":pd:pro:%",我们有数千个 ":ao.mos:pro:%" 文档和相应的 ": pd:pro:%" 用于每个 mo:pro 文档。
我正在使用下面的查询,它可以工作,但它只更新一个可以找到索引的文档。
MERGE INTO `bucket1` AS d
USING `bucket1` AS p
ON d.icc = p.icc AND META(d).id LIKE ':pd:pro:%' AND META(p).id LIKE ':ao.mos:pro:%'
WHEN MATCHED THEN
UPDATE SET d.customerId = p.customerId;
有关如何使此功能适用于存储桶中所有匹配文档的任何建议。
解决方案
以下作品。
CREATE INDEX ix11 ON `default` (icc, customerId) WHERE META().id LIKE ":ao.mos:pro:%";
CREATE INDEX ix12 ON `default` (icc, customerId) WHERE META().id LIKE ":pd:pro:%";
INSERT INTO default VALUES(":ao.mos:pro:1", {"icc":1, "customerId":100});
INSERT INTO default VALUES(":ao.mos:pro:2", {"icc":2, "customerId":101});
INSERT INTO default VALUES(":pd:pro:1", {"icc":1});
INSERT INTO default VALUES(":pd:pro:2", {"icc":1});
INSERT INTO default VALUES(":pd:pro:3", {"icc":2});
MERGE INTO `default` AS m
USING (SELECT p1.icc, p1.customerId
FROM `default` AS p1
WHERE META(p1).id LIKE ':ao.mos:pro:%' AND p1.icc IS NOT NULL) AS p
ON m.icc = p.icc AND META(m).id LIKE ':pd:pro:%'
WHEN MATCHED THEN
UPDATE SET m.customerId = p.customerId;
MERGE INTO `default` AS m
USING default AS p
ON m.icc = p.icc AND META(m).id LIKE ':pd:pro:%' AND META(p).id LIKE ':ao.mos:pro:%'
WHEN MATCHED THEN
UPDATE SET m.customerId = p.customerId;
您是否有以下问题:
第一个源行匹配 2 个目标行。第二个源匹配相同的目标行(通过将 icc 值更改为文档键“:ao.mos:pro:2”的 1)然后在 MERGE 中返回错误(5320 同一文档的多次更新/删除(文档键 'xxx')语句)(与部分更新的行一样,您需要事务不想更新任何内容)因为您不能再次更新同一行。要解决这个问题,您需要更改您的 ON 子句。
推荐阅读
- java - java.lang.AbstractMethodError: org.postgresql.jdbc3.Jdbc3Connection.isValid(I)Z
- awk - 如何从 xmgrace 文件中 grep 一些标签,然后在 gnuplot 脚本中将它们用作刻度标签和箭头位置
- c# - 如何使用 C# 在 Windows 10 中添加 IP 地址
- amazon-web-services - 无法通过 terraform 起草有效的 json 以用作存储桶策略
- reactjs - useState 没有重新渲染
- python - 列出数据框列中每一行的拼接
- html - 如何在保持纵横比的同时使任意 SVG 扩展到其父容器?
- javascript - 如何每 20 毫秒仅捕获 8 个字节的音频缓冲区?
- regex - 使用 sed s/regex/replacement/,如何在替换中同时使用双引号 " 和变量 $v?
- laravel - 当我尝试使用 nginx 连接到我的 lumen api 时返回 502