通过 Direct Discovery使用子查询

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

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

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

场景 1:低基数

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

生成的 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 来允许QlikView 创建子查询。生成的 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子句。