uj

首发版本:3.00.6

语法

uj(leftTable, rightTable, matchingCols, [rightMatchingCols])

详情

按指定列对两张普通内存表执行 union join,并返回合并后的内存表。

该操作兼容 kdb+ 的 uj

  • 以左表为基础,根据 matchingCols 进行等值匹配。

  • 匹配记录由右表更新,右表中的非 matchingCols 的列值覆盖左表同名列;右表中未匹配的记录追加到结果表末尾。

  • 结果表包含左右表的列并集,缺失字段填充空值。

  • matchingColsrightMatchingCols 不一致时,结果表仅保留 matchingCols(左表匹配列)。

注意:该函数当前仅支持普通内存表,不支持 DFS 表、分区表、流表等其他表对象。

参数

leftTable 一个普通内存表,表示左表。

rightTable 一个普通内存表,表示右表。

matchingCols 字符串标量或向量,左边列名,表示匹配列。若为多个列名,则这些列共同组成匹配键。指定的列必须存在于 leftTable 中。

rightMatchingCols 可选参数,字符串标量或向量,表示右表匹配列名。当左右表匹配列名不一致时,必须指定。指定的列必须存在于 rightTable 中,且长度必须与 matchingCols 一致。未指定时,默认使用与 matchingCols 相同的列名在右表中匹配。

注意:

  • leftTable 中按 matchingCols 形成的 key 必须唯一,rightTable 中按 rightMatchingCols 形成的 key 也必须唯一;同一个 key 在单张表中只能出现一行。若未指定 rightMatchingCols,则 rightTablematchingCols 形成的 key 必须唯一。

  • matchingCols 中的 NULL 匹配行为受 enableNullSafeJoin 控制。默认 enableNullSafeJoin=false,NULL 不匹配;将其设置为 true 后,NULL 将视为相等进行匹配。

返回值

常规内存表。

例子

例 1. 右表覆盖左表已有记录,仅一个匹配列,且左右表匹配列名称相同。

t1 = table(`a`b as sym, 10 20 as px)
t2 = table(`b`c as sym, 99 30 as px)
uj(leftTable=t1, rightTable=t2, matchingCols="sym")
sym px
a 10
b 99
c 30

例 2. 匹配列中,右表值与左表值不相同。

t1 = table(`a`b as sym, 10 20 as px)
t2 = table(`c as sym, 300 as qty)
uj(leftTable=t1, rightTable=t2, matchingCols="sym")
sym px qty
a 10
b 20
c 300

例 3. 默认情况下,匹配列中的 NULL 不匹配。

t1 = table(int([NULL, 1]) as id, 10 20 as v)
t2 = table(int([NULL, 2]) as id, 99 30 as v)
uj(leftTable=t1, rightTable=t2, matchingCols="id")
id v
10
1 20
99
2 30

设置 enableNullSafeJoin 为 true,匹配列中的 NULL 视为匹配。

setDynamicConfig("enableNullSafeJoin", true)
uj(leftTable=t1, rightTable=t2, matchingCols="id")
id v
99
1 20
2 30

例 4. 左右表匹配列名不同

t1 = table(1 2 as id, 10 20 as px)
t2 = table(2 3 as rid, 99 30 as px)
uj(leftTable=t1, rightTable=t2, matchingCols="id", rightMatchingCols="rid")
id px
1 10
2 99
3 30

例 5. 指定多个匹配列

t1 = table(
    `AAPL`AAPL`MSFT`MSFT as sym,
    `NASDAQ`NYSE`NASDAQ`NYSE as exch,
    180.5 181.0 320.1 321.0 as px,
    1000 1200 800 900 as vol
)
t2 = table(
    `AAPL`MSFT`GOOG`MSFT as sym,
    `NASDAQ`NASDAQ`NASDAQ`CBOE as exch,
    182.0 319.5 140.0 322.0 as px,
    1500 850 600 950 as vol
)

uj(
    leftTable=t1,
    rightTable=t2,
    matchingCols=["sym", "exch"]
)
sym exch px vol
AAPL NASDAQ 182 1,500
AAPL NYSE 181 1,200
MSFT NASDAQ 319.5 850
MSFT NYSE 321 900
GOOG NASDAQ 140 600
MSFT CBOE 322 950