KDB: как сделать запрос с набором столбцов - PullRequest
0 голосов
/ 24 января 2019

Как мне сделать этот соответствующий 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")
)

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Другой вариант - использовать 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

0 голосов
/ 24 января 2019

Вы также можете добиться этого, используя 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 во многих случаях

0 голосов
/ 24 января 2019

Вывод select hair, eyes from p where any aa like/:("hello";"hi") представляет собой таблицу, поэтому нам нужно составить таблицу из столбцов hair и eyes для требуемого оператора 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"
...