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 QlikView 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 QlikView 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 en produktnyckel (ProductID), där båda tabellerna används i Direct Discovery-läge.

Two linked tables.

Vi skapar ett diagram med OrderMonth som dimension ochSum(Subtotal) som mått, samt en filterbox 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 produktnycklar som matchar den valda storleken, i det här fallet 20 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, månad([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, månad([OrderDate])

Scenario 2: Använda underordnade frå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 produktnycklar. 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 QlikView 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, månad([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, månad([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?

Tack för att du berättar det här. Är det något du vill säga om det här avsnittet?

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