

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用聯合傳遞查詢
<a name="federated-query-passthrough"></a>

在 Athena 中，您可以使用資料來源本身的查詢語言對聯合資料來源執行查詢，並將完整查詢下推到資料來源以便執行。這些查詢稱為傳遞查詢。若要執行傳遞查詢，您可在 Athena 查詢中使用資料表函式。您可以將要在資料來源上執行的傳遞查詢包含在資料表函式的其中一個引數中。傳遞查詢會傳回可使用 Athena SQL 分析的資料表。

## 支援的連接器
<a name="federated-query-passthrough-supported-connectors"></a>

下列 Athena 資料來源連接器支援傳遞查詢。
+ [Azure Data Lake Storage](connectors-adls-gen2.md)
+ [Azure Synapse](connectors-azure-synapse.md)
+ [Cloudera Hive](connectors-cloudera-hive.md)
+ [Cloudera Impala](connectors-cloudera-impala.md)
+ [CloudWatch](connectors-cloudwatch.md)
+ [Db2](connectors-ibm-db2.md)
+ [Db2 iSeries](connectors-ibm-db2-as400.md)
+ [DocumentDB](connectors-docdb.md) 
+ [DynamoDB](connectors-dynamodb.md) 
+ [HBase](connectors-hbase.md)
+ [Google BigQuery](connectors-bigquery.md)
+ [Hortonworks](connectors-hortonworks.md)
+ [MySQL](connectors-mysql.md)
+ [Neptune](connectors-neptune.md)
+ [OpenSearch](connectors-opensearch.md) 
+ [Oracle](connectors-oracle.md)
+ [PostgreSQL](connectors-postgresql.md)
+ [Redshift](connectors-redshift.md)
+ [SAP HANA](connectors-sap-hana.md)
+ [Snowflake](connectors-snowflake.md)
+ [SQL Server](connectors-microsoft-sql-server.md)
+ [Teradata](connectors-teradata.md)
+ [Timestream](connectors-timestream.md)
+ [Vertica](connectors-vertica.md)

## 考量和限制
<a name="federated-query-passthrough-considerations-and-limitations"></a>

在 Athena 中使用傳遞查詢時，請考慮下列幾點：
+ 查詢傳遞僅支援 Athena `SELECT` 陳述式或讀取操作。
+ 查詢效能可能會因資料來源的組態而異。
+ 查詢傳遞不支援 Lake Formation 精細存取控制。
+ [註冊為 Glue Data Catalog](register-connection-as-gdc.md) 的資料來源不支援傳遞查詢。

## 語法
<a name="federated-query-passthrough-syntax"></a>

一般 Athena 查詢傳遞語法如下所示。

```
SELECT * FROM TABLE(catalog.system.function_name(arg1 => 'arg1Value'[, arg2 => 'arg2Value', ...]))
```

注意下列事項：
+ **catalog** – 目標 Athena 聯合連接器名稱或資料目錄名稱。
+ **system** – 包含函式的命名空間。所有 Athena 連接器實作都使用此命名空間。
+ **function\$1name** – 將傳遞查詢下推到資料來源的函式的名稱。這通常稱為 `query`。組合 `catalog.system.function_name` 是函式的完整解析路徑。
+ **arg1、arg2 等** – 函式引數。使用者必須將這些引數傳遞給函式。在大多數情況下，這是傳遞給資料來源的查詢字串。

對於大多數資料來源，第一個和唯一引數是 `query`，後跟箭頭運算子 `=>` 和查詢字串。

```
SELECT * FROM TABLE(catalog.system.query(query => 'query string'))
```

為了簡單起見，您可以省略選用的具名引數 `query` 和箭頭運算子 `=>`。

```
SELECT * FROM TABLE(catalog.system.query('query string'))
```

如果查詢在目標目錄內容中執行，則您可以透過移除 `catalog` 名稱來進一步簡化查詢。

```
SELECT * FROM TABLE(system.query('query string'))
```

如果資料來源需要的引數超出查詢字串所能提供的範圍，則請依資料來源預期的順序使用具名引數。例如，表達式 `arg1 => 'arg1Value'` 包含第一個引數及其值。名稱 *arg1* 專屬於資料來源，並且可能因連接器而異。

```
SELECT * FROM TABLE(
        system.query(
            arg1 => 'arg1Value',
            arg2 => 'arg2Value',
            arg3 => 'arg3Value'
        ));
```

另外，還可以省略引數名稱，進而簡化上述內容。不過，您必須遵循該方法簽章的順序。如需有關函式簽章的詳細資訊，請參閱每個連接器的文件。

```
SELECT * FROM TABLE(catalog.system.query('arg1Value', 'arg2Value', 'arg3Value'))
```

您可以使用完整的函式解析路徑，跨不同的 Athena 連接器執行多個傳遞查詢，如下列範例所示。

```
SELECT c_customer_sk 
    FROM TABLE (postgresql.system.query('select * from customer limit 10'))
UNION
SELECT c_customer_sk 
    FROM TABLE(dynamodb.system.query('select * from customer')) LIMIT 10
```

您可以使用傳遞查詢作為聯合檢視的一部分。適用相同限制。如需詳細資訊，請參閱[查詢聯合檢視](https://docs.aws.amazon.com/athena/latest/ug/running-federated-queries.html#running-federated-queries-federated-views)。

```
CREATE VIEW catalog.database.ViewName AS
    SELECT * FROM TABLE (
        catalog.system.query('query')
    )
```

如需有關搭配使用特定連接器的確切語法的資訊，請參閱個別連接器文件。

### 引號用量
<a name="federated-query-passthrough-syntax-quotation-marks"></a>

引數值 (包括您傳遞的查詢字串) 必須以單引號括住，如下列範例所示。

```
SELECT * FROM TABLE(system.query(query => 'SELECT * FROM testdb.persons LIMIT 10'))
```

當查詢字串以雙引號括住時，查詢會失敗。下列查詢失敗，並顯示錯誤訊息 COLUMN\$1NOT\$1FOUND：行 1:43：無法解析資料欄 'select \$1 from testdb.persons limit 10'。

```
SELECT * FROM TABLE(system.query(query => "SELECT * FROM testdb.persons LIMIT 10"))
```

若要逸出單引號，請在原引號上新增一個單引號 (例如，從 `terry's_group` 變更為 `terry''s_group`)。

## 範例
<a name="federated-query-passthrough-sql-based-connectors-examples"></a>

下列範例查詢會將查詢下推到資料來源。查詢會選取 `customer` 資料表中的所有資料欄，並將結果限制為 10。

```
SELECT * FROM TABLE(
        catalog.system.query(
            query => 'SELECT * FROM customer LIMIT 10;'
        ))
```

下列陳述式會執行相同的查詢，但無需選用的具名引數 `query` 和箭頭運算子 `=>`。

```
SELECT * FROM TABLE(
        catalog.system.query(
            'SELECT * FROM customer LIMIT 10;'
        ))
```

為便於重複使用，也可以將其封裝在聯合檢視中。與檢視搭配使用時，您必須使用完整的函式解析路徑。

```
CREATE VIEW AwsDataCatalog.default.example_view AS
    SELECT * FROM TABLE (
        catalog.system.query('SELECT * FROM customer LIMIT 10;')
    )
```

## 選擇不執行查詢傳遞
<a name="federated-query-passthrough-sql-based-connectors-opting-out"></a>

若要停用傳遞查詢，請新增名為 `enable_query_passthrough` 的 Lambda 環境變數，並將其設定為 `false`。