我遇到了以下情况 - 我使用 Optic API,我使用 containsJoin 将第一个视图按第二个视图进行过滤,以仅获取我想要的行集。然后,我需要将 op.on 定义中使用的属性(两个视图中存在相同的列)包含在我作为结果返回的对象中,此外,该属性必须在没有任何限定符等的情况下存在。
下面是最简单的代码,它模仿了我在我的应用程序中需要执行的操作(使用 TDE 创建的视图)。
const op = require('/MarkLogic/optic');
const testViewToFilter = op.fromLiterals([
{id:1000, val: 10},
{id:1001, val: 11},
{id:1002, val: 12}
], 'testViewToFilter');
const filteringView = op.fromLiterals([{id:1000}], 'filteringView')
testViewToFilter
.existsJoin(
filteringView,
op.on(
testViewToFilter.col('id'),
filteringView.col('id')
)
)
.select([testViewToFilter.col('id')], '')
.result()
我的期望:
[{id: 1000}]
我得到了什么:
[javascript] SQL-AMBCOLUMN: return plan.execute(query); -- Ambiguous column reference: found filteringView.id and id
我做错了什么吗?我怎样才能达到我期望的结果? 我不明白为什么我会在
id列中得到
Ambiguous column reference
。
我对 MarkLogic 版本得到相同的结果:
10.0-9.2
和 10.0-9.5
这是有趣的光学 API 细微差别之一。一旦某个列多次使用同一个名称(即使使用限定符),那么将来您将无法创建任何具有非限定名称的列。
如果我有:
foo.id
和
bar.id
我无法创建id
错误是在
id
行中创建了
.select([testViewToFilter.col('id')], '')
您有两个选择:
新的预选赛:
.select([testViewToFilter.col('id')], 'filleMeIN')
导致
{"filleMeIN.id": 1000}
重新定义列名:
.select([op.as("newId", testViewToFilter.col('id'))], '')
导致
{"newId": 1000}
小提示:这与语言无关。使用 xQuery 时也存在同样的细微差别