跳到主要内容 跳到补充内容

通过 Direct Discovery 使用子查询

如果联接表格的关键字段的基数偏高,即它包含大量的不同值,则 Qlik Sense 中的选项可能会生成大量的 SQL 语句,因为 WHERE key_field IN 子句可以包含大量的值。在这种情况下,可能的解决办法是允许 Qlik Sense 创建子查询。

为了说明这一点,我们使用一个示例,在该示例中使用产品 ID (ProductID) 将产品表格 (ProductTable) 链接到销售订单表格 (SalesOrderDetail),这两个表格都在 Direct Discovery 模式下使用。

Two linked tables.

我们创建含有 OrderMonth 的图表作为维度,并创建含有 Sum(Subtotal) 的图表作为度量,以及用于选择 Size 的筛选框。

A filter box, a bar chart and a table.

场景 1:低基数性

在这种情形下,产品表格包含不同产品的数量,即 266。如果在 Size 中进行选择,Direct Discovery 将会使用包含与选定大小匹配的产品 ID 的 WHERE ProductID IN 子句生成 SQL 语句返回数据,在这种情况下产品数量为 19。

A filter box with selections made,  a bar chart and a table.

生成的 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)将会生成 SQL 语句,且 WHERE ProductID IN 子句包含上千个产品 ID。由此生成的语句对数据源来说太大而难以处理,由于内存或性能可能存在限制或问题。

解决办法是通过将 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 子句。

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!