Subquery's gebruiken met Direct Discovery

Als de cardinaliteit van het sleutelveld dat de tabel samenvoegt hoog is, met andere woorden als het een groot aantal distinctieve waarden bevat, kan een selectie in Qlik Sense een zeer grote SQL-opdracht generen aangezien de clausule WHERE key_field IN een groot aantal waarden kan bevatten. In dat geval is een mogelijke oplossing om Qlik Sense subquery's te laten genereren.

Om dit te illustreren, gebruiken we een voorbeeld waarbij een tabel met producten (ProductTable) is gekoppeld aan een tabel met verkooporders (SalesOrderDetail) via een product-id (ProductID), waarbij beide tabellen worden gebruikt in de Direct Discovery-modus.

Two linked tables.

We maken een diagram met OrderMonth als dimensie en Sum(Subtotal) als meting, en een filtervak voor het selecteren van Size.

A filter box, a bar chart and a table.

Scenario 1: Lage cardinaliteit

In dit scenario bevat de producttabel een gering aantal distinctieve producten, namelijk 266. Als we een selectie uitvoeren in Size, genereert Direct Discovery een SQL-opdracht om de gegevens te retourneren met behulp van een clausule WHERE ProductID IN die de product-id's bevat die overeenkomen met de geselecteerde grootte, in dit geval 19 producten.

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

De SQL die wordt gegenereerd ziet er als volgt uit:

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: Subquery's gebruiken

Als hetzelfde voorbeeld een groot aantal distinctieve producten bevat, bijvoorbeeld 20.000, wordt bij selectie van een dimensiefilter, bijvoorbeeld Size, een SQL-opdracht WHERE ProductID IN gegenereerd met duizenden product-id's. De resulterende opdracht is mogelijk te groot om te worden afgehandeld door de gegevensbron vanwege beperkingen of problemen met geheugen of prestaties.

De oplossing is om Qlik Sense subquery's te laten maken door DirectEnableSubquery in te stellen op true. De gegenereerde SQL-opdracht zou er als volgt kunnen uitzien:

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

De grootte van de clausule WHERE ProductID IN is niet meer afhankelijk van het aantal sleutels dat het resultaat is van de selectie.

De volgende beperkingen zijn van toepassing als u subquery's gebruikt:

  • De syntaxis voor subquery's wordt alleen aangeroepen als u gegevens selecteert waarbij een diagram wordt gefilterd met behulp van gegevens uit een andere tabel.
  • De hoeveelheid gegevens binnen de sleutels is de bepalende factor, niet het aantal sleutels.
  • Subquery's worden alleen aangeroepen als alle betrokken tabellen zich in Direct Discovery-modus bevinden. Als u het diagram filtert met behulp van gegevens uit een tabel die is opgenomen in de geheugenmodus, wordt een clausule IN gegenereerd.