首页 文章

kdb离开加入问题

提问于
浏览
0

我试图在INST列上加入KDB中的两个表 .

src lj `INST xkey map

结果表应该只返回在表(大约300,000行)src(大约600,000行)和表src(大约2,000行)中具有INST的行,但它返回src中每行的行 .

我做错了什么,如何修复它以正确加入?

3 回答

  • 0

    使用 ij 而不是 lj . lj 与SQL的左连接基本相同 . ij 与SQL 's inner join, which seems to be what you'重新查找基本相同 .

  • 0

    我想你想要这个:

    distinct map lj `INST xkey src
    

    见下面的解释 .

    “它为src中的每一行返回行 . ”

    lj的行为符合预期:它从左表中获取每一行,然后连接右表中的其他值,其中键控列上存在匹配 . 如果没有匹配,则在该行中追加空值 . 例如 .

    q)show t1: ([]sym:`GOOG`AAPL`MSFT; size: 3?100.; quant: 3?1000)
    sym  size     quant
    -------------------
    GOOG 40.66642 908
    AAPL 17.80839 360
    MSFT 30.17723 522
    q)show t2: ( [sym:`GOOG`MSFT] currency: `EUR`USD )
    sym | currency
    ----| --------
    GOOG| EUR
    MSFT| USD
    q)t1 lj t2
    sym  size     quant currency
    ----------------------------
    GOOG 40.66642 908   EUR
    AAPL 17.80839 360
    MSFT 30.17723 522   USD
    

    ij(内连接)将排除键控列上没有匹配的行:

    q)t1 ij t2
    sym  size     quant currency
    ----------------------------
    GOOG 40.66642 908   EUR
    MSFT 30.17723 522   USD
    

    q-sql语句:

    map lj `INST xkey src
    

    等同于SQL语句:

    select * from map Left join src ON map.INST = [src].INST
    

    如果您还只想要不同的行,那么您可能需要以下内容:

    distinct map lj `INST xkey src
    

    以来

    对于表,distinct返回不同的行

    http://code.kx.com/q/ref/search/#distinct

    正如Adam所说,您还必须小心使用相同名称的列,这些列不用于创建连接 .

  • 1

    我认为ij不适合你的原因是因为src和map有其他具有相同名称的列 .

    以此架构为例:

    q)src:([INST:1 2 3 4] b:`a`b`c`d)
    q)map:([INST:1 3 4] b:`1`2`3;c:`x`y`z)
    

    在这些上执行ij:

    q)src ij map
    INST| b c
    ----| ---
    1   | 1 x
    3   | 2 y
    4   | 3 z
    

    在这里我们可以看到结果从map表中获取了b的值 .

    要解决此问题,您可以重命名每个表中的列以表示其源表,但要加入的列除外 .

    你可以使用这个功能:

    q)rename_cols:{[tbl_name;key_col;cur_col] if[key_col~cur_col;:cur_col]; :`$tbl_name,".",(string cur_col) }
    

    要编辑表格:

    q)src:(rename_cols["src";`INST;] each cols src) xcol src;
    q)map:(rename_cols["map";`INST;] each cols map) xcol map;
    q)src
    INST| src.b
    ----| -----
    1   | a
    2   | b
    3   | c
    4   | d
    q)map
    INST| map.b map.c
    ----| -----------
    1   | 1     x
    3   | 2     y
    4   | 3     z
    

    现在:

    q)src ij map
    INST| src.b map.b map.c
    ----| -----------------
    1   | a     1     x
    3   | c     2     y
    4   | d     3     z
    

    缺少INST = 2,因为它不存在于两个表中,但是从两个表中获取每列 .

    希望这是你需要的 .

相关问题