Använda underordnade frågor med Direct Discovery

Om kardinaliteten av nyckelfältet som slår samman tabellen, det vill säga om den innehåller ett stort antal distinkta värden, kan ett urval i Qlik Sense generera en mycket lång SQL-sats, eftersom WHERE key_field IN-satsen kan innehålla ett stort antal värden. I så fall är en möjlig lösning att låta Qlik Sense skapa underordnade frågor istället.

För att illustrera detta använder vi ett exempel där en produkttabell (ProductTable) är länkad till en försäljningsordertabell (SalesOrderDetail) med hjälp av ett produkt-id (ProductID), där båda tabellerna används i Direct Discovery-läge.

Two linked tables.

Vi skapar ett diagram med OrderMonth som dimension och Sum(Subtotal) som mått, samt en filterruta för att välja Size.

A filter box, a bar chart and a table.

Scenario 1: Låg kardinalitet

I det här scenariet innehåller produkttabellen ett lågt antal distinkta produkter, 266. Om vi gör ett urval i Size, genererar Direct Discovery en SQL-sats för att returnera data med hjälp av en WHERE ProductID IN-sats som innehåller produkt-ID som matchar den valda storleken, i det här fallet 19 produkter.

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

De SQL-data som genereras ser ut så här:

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])

Scenario 2: Använda delfrågor

Om samma exempel innehåller ett högt antal distinkta produkter, till exempel 20 000, kan användning av ett dimensionsfilter som t.ex. Size generera en SQL-sats med en WHERE ProductID IN-sats som innehåller tusentals produkt-ID. Den sats som då genereras kan vara för lång för att kunna hanteras av datakällan, på grund av begränsningar eller problem med minne eller prestanda.

Lösningen är att låta Qlik Sense skapa underordnade frågor istället genom att ställa in DirectEnableSubquery på sann. Den genererade SQL-satsen kanske ser ut så här istället:

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])
 

Storleken på WHERE ProductID IN-satsen beror då inte längre på antalet nycklar som urvalet ger upphov till.

Följande begränsningar gäller när du använder underordnade frågor:

  • Syntaxen för underordnade frågor tillämpas bara om du väljer data som kräver filtrering av ett diagram med hjälp av data från en annan tabell.
  • Mängden data i nycklarna är en avgörande faktor, inte antalet nycklar i sig.
  • Underordnade frågor tillämpas bara om alla tabeller är i läget Direct Discovery. Om du filtrerar diagrammet med hjälp av data från en tabell som inkluderas i minnesläge kommer en IN-sats att genereras.

Hjälpte den här informationen?

Varför var informationen inte till hjälp och hur kan vi förbättra den?