通过
Direct Discovery
使用子查询
如果联接表格的关键字段的基数偏高,即它包含大量的不同值,则
Qlik Sense
中的选项可能会生成大量的
SQL
语句,因为
WHERE key_field IN
子句可以包含大量的值。在这种情况下,可能的解决办法是允许
Qlik Sense
创建子查询。
为了说明这一点,我们使用一个示例,在该示例中使用产品 ID (
ProductID
) 将产品表格 (
ProductTable
) 链接到销售订单表格 (
SalesOrderDetail
),这两个表格都在
Direct Discovery
模式下使用。
我们创建含有
OrderMonth
的图表作为维度,并创建含有
Sum(Subtotal)
的图表作为度量,以及用于选择
Size
的筛选框。
场景 1:低基数性
在这种情形下,产品表格包含不同产品的数量,即 266。如果在
Size
中进行选择,
Direct Discovery
将会使用包含与选定大小匹配的产品 ID 的
WHERE ProductID IN
子句生成
SQL
语句返回数据,在这种情况下产品数量为 19。
生成的
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
子句。