# 使用子查詢和 Direct Discovery

如果聯結表格的索引鍵欄位的基數高，即它包含大量相異值，在 Qlik Sense 中的一個選取可能會產生非常大的 SQL 陳述式，因為 WHERE key\_field IN 子句可能包含大量的值。這種情況下，一種可能的解決方案是將 Qlik Sense 改為建立子查詢。

我們舉例來說明這一點，一個產品表格 (ProductTable) 使用產品 ID (ProductID) 連結到銷售訂單表格 (SalesOrderDetail)，兩個表格均在 Direct Discovery 模式下使用。

![Two linked tables.](https://help.qlik.com/zh-TW/sense/May2025/Subsystems/Hub/Content/Resources/Images/ex_gen_DirectDiscoverySubquery1.png)

我們建立一個以 OrderMonth 為維度、以 Sum(Subtotal) 為量值的圖表，以及一個用於選取 Size 的篩選方塊。

![A filter box, a bar chart and a table.](https://help.qlik.com/zh-TW/sense/May2025/Subsystems/Hub/Content/Resources/Images/ex_gen_DirectDiscoverySubquery2.png)

## 情境 1：低基數

在此案例中，產品表格包含數量較少的不同產品，266 種。如果我們在 Size 中進行選取，Direct Discovery 會使用包含符合所選大小 (在此案例中為 19 種產品) 的產品 ID 的 WHERE ProductID IN 子句，產生一個 SQL 陳述式以傳回資料。

![A filter box with selections made,  a bar chart and a table.](https://help.qlik.com/zh-TW/sense/May2025/Subsystems/Hub/Content/Resources/Images/ex_gen_DirectDiscoverySubquery3.png)

所產生的 SQL 如下所示：

```
SELECT ProductID, month([OrderDate]), SUM(OrderQty), SUM(SubTotal)
```

```
FROM SalesTable
```

```
WHERE ProductID IN ( 12, 51, 67, 81, 89, 92, 100, 108, 142, 150, 151, 162, 191, 206, 220, 222, 251, 254)
```

GROUP BY ProductID, month([OrderDate])

## 情境 2：使用子查詢

如果同樣的例子中包含數量較大的不同產品 (例如 20.000 種)，選取一個維度篩選器 (例如 Size)，會使用包含數以千計產品 ID 的 WHERE ProductID IN 子句產生一個 SQL 陳述式。產生的陳述式可能過大，並因為記憶體或效能的限制或問題而無法被資料來源處理。

解決方案是將 DirectEnableSubquery 設為 true，使 Qlik Sense 轉而建立子查詢。這時，產生 SQL 陳述式就會如下所示：

SELECT ProductID, month([OrderDate]), SUM(OrderQty), SUM(SubTotal)

FROM SalesTable

WHERE ProductID IN

( SELECT DISTINCT "AW2012"."dbo"."PRODUCT"."PRODUCTID" WHERE "AW2012"."dbo"."PRODUCT"."SIZE" IN (3))

GROUP BY ProductID, month([OrderDate])

WHERE ProductID IN 子句大小不再取決於選項產生的索引鍵數量。

使用子查詢有以下限制：

* 只有您的資料選取涉及使用另一表格的資料篩選圖表時，才能調用子查詢語法。
* 索引鍵內的資料量是決定因素，而非索引鍵數量。
* 只有所有涉及的表格均處於 Direct Discovery 模式時，才能調用子查詢。如果您使用處於記憶體模式的表格中的資料來篩選圖表，將會產生 IN 子句。