Merge
Merge-prefixet kan adderas till valfri LOAD- eller SELECT-sats i skriptet för att specificera att den laddade tabellen ska slås samman med en annan tabell. Det specificerar även att satsen ska köras i en delvis laddning.
Används ofta när du laddar en ändringslogg och vill använda denna för att tillämpa inserts, updates och deletes på en befintlig tabell.
Gör en delvis laddning med knappen Ladda. Mer information finns i Knapp. Du kan även använda Qlik Engine JSON API.
Syntax:
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
Argument:
Argument | Beskrivning |
---|---|
only | En valfri kvalificerare som innebär att satsen bara ska exekveras vid delvisa laddningar. Satsen ska ignoreras vid vanliga (ej delvisa) laddningar. |
SequenceNoField | Namnet på det fält som innehåller en tidsmarkör eller ett ordningstal som definierar ordningen för operationerna. |
SequenceNoVar |
Namnet på den variabel som blir tilldelad det högsta värdet för SequenceNoField i tabellen som slås ihop. |
ListOfKeys | En kommaavgränsad lista med fältnamn som specificerar den primära nyckeln. |
Operation | Det första fältet i LOAD-satsen måste innehålla operationen som textsträng: "Insert", "Update'" eller "Delete". "i", "u" och "d" accepteras också. |
Allmän funktionalitet
Vid en vanlig (ej delvis) laddning fungerar konstruktionen Merge LOAD som en vanlig LOAD-sats, med tillägget att äldre, obsoleta poster tas bort, liksom poster som markerats för borttagning. Det första fältet i LOAD-satsen måste innehålla information om operationen: Insert, Update eller Delete.
För varje post som laddas jämförs postens identifierare med poster som laddats tidigare, och bara den senaste posten (enligt ordningstalet) sparas. Om den senaste posten har en Delete-markering sparas inte någon.
Måltabell
Vilken tabell som ska ändras bestäms av uppsättningen fält. Om en tabell med samma uppsättning fält (förutom det första fältet; operationen) redan finns, kommer detta att vara den relevanta tabellen att ändra. Alternativt kan prefixet Concatenate användas för att specificera tabellen. Om måltabellen inte är fastställd, lagras resultatet av Merge LOAD-konstruktionen i en ny tabell.
Om prefixet Concatenate används, har den resulterande tabellen en uppsättning fält som motsvarar föreningen av den befintliga tabellen och indata till sammanslagningen. Därför kan måltabellen få fler fält än ändringsloggen som används som indata för sammanslagningen.
En delvis laddning gör samma sak som en fullständig laddning. En skillnad är att en partiell omladdning sällan skapar en ny tabell. Om du inte har använts satsen Only, finns alltid en måltabell med samma uppsättning fält från föregående skriptkörning.
Sekvensnummer
Om den laddade ändringsloggen är en ackumulerad logg, det vill säga innehåller ändringar som redan har laddats, kan parametern SequenceNoVar användas i en Where-sats för att begränsa mängden indata. Då kan Merge LOAD formuleras så att bara poster där fältet SequenceNoField är större än SequenceNoVar laddas. När exekveringen är klar tilldelar Merge LOAD ett nytt värde till SequenceNoVar med det största värde som finns i fältet SequenceNoField.
Operationer
Merge LOAD kan ha färre fält än måltabellen. De olika operationerna behandlar saknade fält olika:
Insert: fält som saknas i Merge LOAD, men som finns i måltabellen, får NULL i måltabellen.
Delete: saknade fält påverkar inte resultatet. Relevanta poster raderas ändå.
Update: fält som listas i Merge LOAD uppdateras i måltabellen. Saknade fält ändras inte. Det betyder att de två följande påståendena inte är identiska:
- Merge on Key Concatenate Load 'U' as Operation, Key, F1, Null() as F2 From ...;
- Merge on Key Concatenate Load 'U' as Operation, Key, F1 From ...;
Den första satsen uppdaterar de listade posterna och ändrar F2 to NULL. Den andra ändrar inte F2, utan lämnar i stället värdena i måltabellen.