Marklogic - Optic API:按值连接视图(op:on 不支持值,仅支持列引用)
Marklogic - Optic API: Joining views by value (op:on does not support values, only column-references)
我正在尝试使用 op:join-left-outer
函数连接两个视图“A”和“B”。
我有两个 JOIN 的“开启条件”:
- 第一个是简单的
op:on
函数。 (这不是我的问题的一部分)
- 第二个应该是按值连接列的 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 中做同样的事情,还是我做错了什么?
有趣的是,当我尝试使用第二个 op:on()
时,左右两边都有列引用(通过将 42 绑定为 aView 上的新列),我也没有得到预期的结果。
但是,如果以不同的方式表达,Optic API 似乎确实允许您做您想做的事:
- op:join-left-outer() documentation 显示第四个参数 - 条件。
- op:eq() 允许混合使用列引用和常量。
因此,我希望您可以删除第二个 op:on()
并将以下内容用作第 4 个参数:op:eq(op:view-col("B", "SOME_OTHER_COLUMN"), $myValue)
下面是一个独立的示例 - 其中生成的第二行具有外部连接的空值 table
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()
我正在尝试使用 op:join-left-outer
函数连接两个视图“A”和“B”。
我有两个 JOIN 的“开启条件”:
- 第一个是简单的
op:on
函数。 (这不是我的问题的一部分) - 第二个应该是按值连接列的 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 中做同样的事情,还是我做错了什么?
有趣的是,当我尝试使用第二个 op:on()
时,左右两边都有列引用(通过将 42 绑定为 aView 上的新列),我也没有得到预期的结果。
但是,如果以不同的方式表达,Optic API 似乎确实允许您做您想做的事:
- op:join-left-outer() documentation 显示第四个参数 - 条件。
- op:eq() 允许混合使用列引用和常量。
因此,我希望您可以删除第二个 op:on()
并将以下内容用作第 4 个参数:op:eq(op:view-col("B", "SOME_OTHER_COLUMN"), $myValue)
下面是一个独立的示例 - 其中生成的第二行具有外部连接的空值 table
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()