Marklogic - Optic API:按值连接视图(op:on 不支持值,仅支持列引用)

问题描述 投票:0回答:1

我正在尝试使用 op:join-left-outer 函数连接两个视图“A”和“

B
”。

我有两个“ON 条件”用于 JOIN:

  1. 第一个是一个简单的
    op:on
    函数。 (这不是我的问题的一部分)
  2. 第二个应该是按值连接列的 ON 条件 (
    $myValue
    )。但
    op:on
    不支持值,仅支持列引用。所以下面的代码不起作用:
let $aView := op:from-view("foobar", "A")
let $bView := op:from-view("foobar", "B")

let $myValue := "42"

let $opticQuery := op:join-left-outer(
  $aView, 
  $bView, 
  (
    op:on(op:view-col("A", "SOME_COLUMN"), op:view-col("B", "SOME_COLUMN")),
    
    (: Not working pseudo code following :)
    op:on(op:view-col("B", "SOME_OTHER_COLUMN"), $myValue)
  )
)

在 SQL 中我会写这样的东西:

SELECT * FROM A
LEFT JOIN B
ON A.SOME_COLUMN = B.SOME_COLUMN
AND B.SOME_OTHER_COLUMN = '42'

我的问题: 有没有办法在 Optic API 中做同样的事情,或者我做错了什么?

xquery marklogic marklogic-10 marklogic-optic-api
1个回答
2
投票

有趣的是,当尝试使用第二个

op:on()
(通过将 42 绑定为 aView 上的新列)时,我也没有得到预期的结果。

但是,如果以不同的方式表达,Optic API 似乎确实允许你做你想做的事:

因此,我希望您可以删除第二个

op:on()

并使用以下内容作为第四个参数:
op:eq(op:view-col("B", "SOME_OTHER_COLUMN"), $myValue)

下面是一个独立的示例 - 其中生成的第二行对于外部连接表具有空值

xquery version "1.0-ml"; import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy"; let $myVal := 42 let $plan-table-1 := op:from-literals(( map:entry("col1", 1) => map:with("val", "a"), map:entry("col1", 2) => map:with("val", "b") ), "table1") let $plan-table-2 := op:from-literals(( map:entry("col1", 1) => map:with("val2", "c") => map:with("someOtherCol", 42), map:entry("col1", 2) => map:with("val2", "d") => map:with("someOtherCol", 8) ), "table2") return op:join-left-outer( $plan-table-1, $plan-table-2, op:on(op:view-col("table1", "col1"), op:view-col("table2", "col1")), op:eq(op:view-col("table2", "someOtherCol"), $myVal) )=>op:result()
    
© www.soinside.com 2019 - 2024. All rights reserved.