【问题标题】:KDB: How to query with a set of columnsKDB:如何使用一组列进行查询
【发布时间】:2019-01-24 15:45:38
【问题描述】:

这个对应的SQL查询怎么做:

select * from a where (col1, col2) in (select x, y from b)

如果我有

p:([]name:`John`Mary`David`James; age:52 49 18 23; hair:("black";"black";"blonde";"black"); eyes:`brown`brown`blue`brown; aa:("hello";"world";"hi";"there"))

如何使这个查询工作:

select from p where (hair, eyes) in (
select hair, eyes from p where any aa like/:("hello";"hi")
)

【问题讨论】:

  • 嗨,你能举一个你期望输出的例子吗?

标签: kdb


【解决方案1】:

select hair, eyes from p where any aa like/:("hello";"hi") 的输出是一个表,所以我们需要从 haireyes 列中为您想要的 where 语句创建一个表:

q)select from p where ([]hair;eyes) in select hair, eyes from p where any aa like/:("hello";"hi")
name  age hair     eyes  aa
--------------------------------
John  52  "black"  brown "hello"
Mary  49  "black"  brown "world"
David 18  "blonde" blue  "hi"
James 23  "black"  brown "there"

【讨论】:

    【解决方案2】:

    您也可以使用fby 实现此目的

    q)select from p where (any;any aa like/:("hello";"hi")) fby ([]hair;eyes)
    name  age hair     eyes  aa
    --------------------------------
    John  52  "black"  brown "hello"
    Mary  49  "black"  brown "world"
    David 18  "blonde" blue  "hi"
    James 23  "black"  brown "there"
    

    fby 允许您基于特定分组应用聚合,然后根据这些聚合进行过滤。在这种情况下,提供的其他一些解决方案可能更具可读性,但fby 是一个强大的工具,可以帮助避免在很多情况下使用嵌套的select 语句

    【讨论】:

      【解决方案3】:

      其他选项是使用 equi-join (ej):

       q) ej[`hair`eyes;select from p where any aa like/:("hello";"hi");p]
      
      name  age hair     eyes  aa
      --------------------------------
      John  52  "black"  brown "hello"
      Mary  49  "black"  brown "world"
      James 23  "black"  brown "there"
      David 18  "blonde" blue  "hi"
      

      请注意,这将按用于相等的列对结果进行排序。在这个例子中,它是由头发、眼睛列组成的。因此该顺序可能与表中行的实际顺序不同。

      在此处了解 ej:https://code.kx.com/q/ref/joins/#ej-equi-join

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 2019-10-05
        • 2021-12-15
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多