【问题标题】:Query multiple tables in KDB查询 KDB 中的多个表
【发布时间】:2014-09-01 08:07:26
【问题描述】:

我想查询 KDB 中的多个表。例如。如何在 KDB 中编写以下 SQL 查询(我不擅长 SQL,所以查询格式可能是错误的):

select from table1,table2 where table1.sym=table2.sym and table1.price>table2.price

我知道一些方法,例如。加入。但是 KDB 中是否有任何与 SQL 相同的功能,它只是在表上使用点符号。

同样在 SQL 中,我们可以将上述查询扩展到“n”个表和过滤器。我们可以在 KDB 中做到这一点而无需进行复杂的表达式吗?

【问题讨论】:

    标签: database kdb


    【解决方案1】:

    我害怕简短的回答是不。

    您一次只能查询 1 个表。您必须先进行连接。我不太了解 SQL,但我确信 SQL 引擎无论如何都会在后台进行连接操作以便能够做到这一点(?)所以如果有办法在 q 中通过一个函数来做到这一点会加入。

    如果你想提取列向量,你可以像这样索引到一个表中(避免函数内的点表示法):

    table[`sym]
    

    (将 sym 列作为向量,假设表没有键控) (注意在张开的桌子上这样做时要小心!)

    例如,您可以将其用于 where 子句中的 in 查询。或者,如果您的表长度完全相同,您可以使用它来创建一个新的临时临时表(但这仍然是一种连接!)

    这与不使用通常的 ,ljuj 等一样接近

    【讨论】:

    • 使用 join 我可以做到这一点。只是想确认是否有像SQL这样的简单方法。通过查看您的答案,似乎 join 是唯一的方法。
    【解决方案2】:

    没有。

    SQL 是一种声明性语言。您的查询告诉数据库您想要什么,而不是如何做。 SQL 优化器检查您的查询,生成一个运算符树,估计执行每个操作的成本,并尝试重新排序树以最小化总成本。

    Q 没有数据库优化器,除了坐在键盘上的那个。您必须确定操作的顺序,并且必须以正确的顺序执行它们。

    此外,Q 对列进行操作,而不是对行进行操作。所以table1.price>table2.price 没有意义,除非 table1 和 table2 的长度完全相同。通常人们通过重命名第二列、执行连接、然后过滤生成的单个表来处理这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多