

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# subqueries
<a name="CWL_QuerySyntax-Subqueries"></a>

子查询是一种嵌套的 Logs Insights 查询，可用作其他查询的输入。子查询可用于派生中间结果集，然后由后续命令使用。

**语法**  


**筛选器中的子查询**  


```
filter <field> in (
    <subquery>
)
```

**参数**  

+ `<subquery>`— 返回结果集的有效 Logs Insights 查询。子查询必须生成由外部查询引用的字段。

**示例**  


**Example 示例 1：查找在下游服务中遇到错误的请求**  
此示例说明如何使用子查询来识别主服务中导致下游服务出错的请求。这对于排除分布式系统中的级联故障非常有用。  

```
filter requestId in (
    SOURCE '/aws/lambda/database-service'
    | filter errorType = "DatabaseConnectionTimeout"
    | fields requestId
)
| fields @timestamp, requestId, endpoint, userId, responseTime
| sort @timestamp desc
```
这个查询：  

1. 子查询从数据库服务中查找所有遇到连接超时的`requestId`值

1. 外部查询会筛选主服务的日志，仅显示与那些容易出错的请求相匹配的请求 IDs

1. 结果显示了下游失败的请求的完整背景，包括哪些端点和用户受到了影响
这种模式可以帮助您了解下游故障对上游的影响。

**Example 示例 2：识别经常失败的定向调查请求**  
此示例演示了使用带聚合功能的子查询来查找重复失败的请求，这通常表示系统性问题而不是暂时性错误。  

```
filter requestId in (
    SOURCE '/aws/lambda/payment-processor'
    | filter status = "FAILED"
    | stats count(*) as failureCount by requestId
    | filter failureCount > 3
    | fields requestId
)
| fields @timestamp, requestId, customerId, amount, failureReason
| sort @timestamp asc
```
这个查询：  

1. 子查询汇总失败的付款尝试并识别失败次数超过 3 次 IDs 的请求

1. 外部查询会检索那些有问题的请求的所有日志事件 IDs

1. 结果按时间顺序排序，以显示重试的进度
这有助于区分需要更深入调查的暂时性故障（单次出现）和持续性问题（多次故障）。

**行为**  

+ 子查询独立于外部查询执行。
+ 结果在被外部查询使用之前被具体化。
+ 只有在子查询中明确选择的字段才可供外部查询使用。

**注释和限制**  

+ 子查询必须返回外部查询引用的字段。
+ 不支持嵌套子查询。
+ 子查询可能会增加查询的执行时间和成本。
+ 不支持关联子查询。
+ 内部查询执行限制在 30 秒以内。

**相关命令**  

+ [字段](CWL_QuerySyntax-Fields.md)
+ [筛选条件](CWL_QuerySyntax-Filter.md)
+ [解析](CWL_QuerySyntax-Parse.md)
+ [stats](CWL_QuerySyntax-Stats.md)
+ [排序](CWL_QuerySyntax-Sort.md)
+ [limit](CWL_QuerySyntax-Limit.md)