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 ...