comando subquery - OpenSearch Serviço Amazon

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

comando subquery

nota

Para ver quais integrações AWS de fontes de dados oferecem suporte a esse PPL comando, consulteComandos.

Use o subquery comando para realizar consultas complexas e aninhadas em suas instruções Piped Processing Language ()PPL.

source=logs | where field in [ subquery source=events | where condition | fields field ]

Neste exemplo, a pesquisa primária (source=logs) é filtrada pelos resultados da subconsulta ()source=events.

O comando subquery oferece suporte a vários níveis de aninhamento para análise complexa de dados.

Exemplo de subconsulta aninhada

source=logs | where id in [ subquery source=users | where user in [ subquery source=actions | where action="login" | fields user] | fields uid ]
InSubquery Uso
  • source = outer | where a in [ source = inner | fields b ]

  • source = outer | where (a) in [ source = inner | fields b ]

  • source = outer | where (a,b,c) in [ source = inner | fields d,e,f ]

  • source = outer | where a not in [ source = inner | fields b ]

  • source = outer | where (a) not in [ source = inner | fields b ]

  • source = outer | where (a,b,c) not in [ source = inner | fields d,e,f ]

  • source = outer a in [ source = inner | fields b ](filtragem de pesquisa com subconsulta)

  • source = outer a not in [ source = inner | fields b ](filtragem de pesquisa com subconsulta)

  • source = outer | where a in [ source = inner1 | where b not in [ source = inner2 | fields c ] | fields b ](aninhado)

  • source = table1 | inner join left = l right = r on l.a = r.a AND r.a in [ source = inner | fields d ] | fields l.a, r.a, b, c(como filtro de junção)

SQLExemplos de migração com IN-SubQuery PPL

TPC-H Q4 (na subconsulta com agregação)

select o_orderpriority, count(*) as order_count from orders where o_orderdate >= date '1993-07-01' and o_orderdate < date '1993-07-01' + interval '3' month and o_orderkey in ( select l_orderkey from lineitem where l_commitdate < l_receiptdate ) group by o_orderpriority order by o_orderpriority

Reescrito por PPL InSubquery consulta:

source = orders | where o_orderdate >= "1993-07-01" and o_orderdate < "1993-10-01" and o_orderkey IN [ source = lineitem | where l_commitdate < l_receiptdate | fields l_orderkey ] | stats count(1) as order_count by o_orderpriority | sort o_orderpriority | fields o_orderpriority, order_count

TPC-H Q20 (aninhado na subconsulta)

select s_name, s_address from supplier, nation where s_suppkey in ( select ps_suppkey from partsupp where ps_partkey in ( select p_partkey from part where p_name like 'forest%' ) ) and s_nationkey = n_nationkey and n_name = 'CANADA' order by s_name

Reescrito por PPL InSubquery consulta:

source = supplier | where s_suppkey IN [ source = partsupp | where ps_partkey IN [ source = part | where like(p_name, "forest%") | fields p_partkey ] | fields ps_suppkey ] | inner join left=l right=r on s_nationkey = n_nationkey and n_name = 'CANADA' nation | sort s_name
ExistsSubquery uso

Suposições:a, b são campos da tabela externa,c, d são campos da tabela interna,e, f são campos da tabela interna2.

  • source = outer | where exists [ source = inner | where a = c ]

  • source = outer | where not exists [ source = inner | where a = c ]

  • source = outer | where exists [ source = inner | where a = c and b = d ]

  • source = outer | where not exists [ source = inner | where a = c and b = d ]

  • source = outer exists [ source = inner | where a = c ](filtragem de pesquisa com subconsulta)

  • source = outer not exists [ source = inner | where a = c ](filtragem de pesquisa com subconsulta)

  • source = table as t1 exists [ source = table as t2 | where t1.a = t2.a ](o alias da tabela é útil na subconsulta exists)

  • source = outer | where exists [ source = inner1 | where a = c and exists [ source = inner2 | where c = e ] ](aninhado)

  • source = outer | where exists [ source = inner1 | where a = c | where exists [ source = inner2 | where c = e ] ](aninhado)

  • source = outer | where exists [ source = inner | where c > 10 ](não correlacionado existe)

  • source = outer | where not exists [ source = inner | where c > 10 ](não correlacionado existe)

  • source = outer | where exists [ source = inner ] | eval l = "nonEmpty" | fields l(existe um especial não correlacionado)

ScalarSubquery uso

Suposições:a, b são campos da tabela externa,c, d são campos da tabela interna,e, f são campos da tabela aninhados

Subconsulta escalar não correlacionada

Em Selecionar:

  • source = outer | eval m = [ source = inner | stats max(c) ] | fields m, a

  • source = outer | eval m = [ source = inner | stats max(c) ] + b | fields m, a

Em onde:

  • source = outer | where a > [ source = inner | stats min(c) ] | fields a

No filtro de pesquisa:

  • source = outer a > [ source = inner | stats min(c) ] | fields a

Subconsulta escalar correlacionada

Em Selecionar:

  • source = outer | eval m = [ source = inner | where outer.b = inner.d | stats max(c) ] | fields m, a

  • source = outer | eval m = [ source = inner | where b = d | stats max(c) ] | fields m, a

  • source = outer | eval m = [ source = inner | where outer.b > inner.d | stats max(c) ] | fields m, a

Em onde:

  • source = outer | where a = [ source = inner | where outer.b = inner.d | stats max(c) ]

  • source = outer | where a = [ source = inner | where b = d | stats max(c) ]

  • source = outer | where [ source = inner | where outer.b = inner.d OR inner.d = 1 | stats count() ] > 0 | fields a

No filtro de pesquisa:

  • source = outer a = [ source = inner | where b = d | stats max(c) ]

  • source = outer [ source = inner | where outer.b = inner.d OR inner.d = 1 | stats count() ] > 0 | fields a

Subconsulta escalar aninhada

  • source = outer | where a = [ source = inner | stats max(c) | sort c ] OR b = [ source = inner | where c = 1 | stats min(d) | sort d ]

  • source = outer | where a = [ source = inner | where c = [ source = nested | stats max(e) by f | sort f ] | stats max(d) by c | sort c | head 1 ]

Subconsulta (Relação)

InSubquery, ExistsSubquery e ScalarSubquery são todas expressões de subconsulta. Mas não RelationSubquery é uma expressão de subconsulta, é um plano de subconsulta que é comumente usado na cláusula Join ou From.

  • source = table1 | join left = l right = r [ source = table2 | where d > 10 | head 5 ](subconsulta na junção do lado direito)

  • source = [ source = table1 | join left = l right = r [ source = table2 | where d > 10 | head 5 ] | stats count(a) by b ] as outer | head 1

Contexto adicional

InSubquery,ExistsSubquery, e ScalarSubquery são expressões de subconsulta comumente usadas em where cláusulas e filtros de pesquisa.

Onde comanda:

| where <boolean expression> | ...

Filtro de pesquisa:

search source=* <boolean expression> | ...

Uma expressão de subconsulta pode ser usada em uma expressão booleana:

| where orders.order_id in [ source=returns | where return_reason="damaged" | field order_id ]

O orders.order_id in [ source=... ] é um<boolean expression>.

Em geral, chamamos esse tipo de cláusula de subconsulta de expressão. InSubquery É um<boolean expression>.

Subconsulta com diferentes tipos de junção

Exemplo usando um ScalarSubquery:

source=employees | join source=sales on employees.employee_id = sales.employee_id | where sales.sale_amount > [ source=targets | where target_met="true" | fields target_value ]

Ao contrário de InSubquery ExistsSubquery,, e ScalarSubquery, a não RelationSubquery é uma expressão de subconsulta. Em vez disso, é um plano de subconsulta.

SEARCH source=customer | FIELDS c_custkey | LEFT OUTER JOIN left = c, right = o ON c.c_custkey = o.o_custkey [ SEARCH source=orders | WHERE o_comment NOT LIKE '%unusual%packages%' | FIELDS o_orderkey, o_custkey ] | STATS ...