Dela via


innerunique-koppling

Gäller för: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Den innerunique kopplingssmaken tar bort dubblettnycklar från vänster sida. Det här beteendet säkerställer att utdata innehåller en rad för varje kombination av unika vänster- och högernycklar.

Som standard används innerunique kopplingssmaken om parametern kind inte har angetts. Den här standardimplementeringen är användbar i log/trace-analysscenarier, där du vill korrelera två händelser baserat på ett delat korrelations-ID. Det gör att du kan hämta alla instanser av fenomenet samtidigt som du bortser från duplicerade spårningsposter som bidrar till korrelationen.

diagram som visar hur kopplingen fungerar.

Syntax

LeftTable|joinkind=innerunique [ Tips ] RightTableonVillkor

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Krävs Beskrivning
LeftTable string ✔️ Det vänstra tabell- eller tabelluttrycket, som ibland kallas för den yttre tabellen, vars rader ska sammanfogas. Anges som $left.
tips string Noll eller fler blankstegsavgränsade kopplingstips i form av Name=Value som styr beteendet för radmatchningsåtgärden och körningsplanen. Mer information finns i Tips.
RightTable string ✔️ Den högra tabellen eller tabelluttrycket, som ibland kallas för den inre tabellen, vars rader ska sammanfogas. Anges som $right.
villkor string ✔️ Avgör hur rader från LeftTable- matchas med rader från RightTable. Om de kolumner som du vill matcha har samma namn i båda tabellerna använder du syntaxen ONColumnName. Annars använder du syntaxen ON $left.LeftColumn==$right.RightColumn. Om du vill ange flera villkor kan du antingen använda nyckelordet "och" eller separera dem med kommatecken. Om du använder kommatecken utvärderas villkoren med hjälp av den logiska operatorn "och".

Dricks

För bästa prestanda, om en tabell alltid är mindre än den andra, använder du den som vänster sida av kopplingen.

Tips

Namn på parametrar Värden Beskrivning
hint.remote auto, left, local, right Se
hint.strategy=broadcast Anger hur du delar frågebelastningen på klusternoder. Se broadcast join
hint.shufflekey=<key> Den shufflekey frågan delar frågebelastningen på klusternoder med hjälp av en nyckel för att partitioneras data. Se shuffle-fråga
hint.strategy=shuffle Den shuffle strategifrågan delar frågebelastningen på klusternoder, där varje nod bearbetar en partition av data. Se shuffle-fråga

Returnerar

Schema: Alla kolumner från båda tabellerna, inklusive matchande nycklar.
Rader: Alla deduplicerade rader från den vänstra tabellen som matchar rader från den högra tabellen.

Exempel

Granska exemplen och kör dem på datautforskarens frågesida.

Använd standardanslutningen innerunique

Exempelfrågan kombinerar rader från tabellerna X och Y där nycklarna matchar, och visar endast de rader som finns i båda tabellerna

let X = datatable(Key:string, Value1:long)
[
    'a',1,
    'b',2,
    'b',3,
    'c',4
];
let Y = datatable(Key:string, Value2:long)
[
    'b',10,
    'c',20,
    'c',30,
    'd',40
];
X | join Y on Key

utdata

Nyckel Värde 1 Key1 Värde 2
b 2 b 10
c 4 c 20
c 4 c 30

Not

Nycklarna "a" och "d" visas inte i utdata eftersom det inte fanns några matchande nycklar på både vänster och höger sida.

Frågan körde standardkopplingen, som är en inre koppling efter deduplicering av vänster sida baserat på kopplingsnyckeln. Dedupliceringen behåller endast den första posten. Den resulterande vänstra sidan av kopplingen efter deduplicering är:

Nyckel Värde 1
a 1
b 2
c 4

Två möjliga utdata från innerunique-koppling

Not

Den innerunique kopplingssmaken kan ge två möjliga utdata och båda är korrekta. I de första utdatan valde kopplingsoperatorn slumpmässigt den första nyckeln som visas i t1, med värdet "val1.1" och matchade den med t2-nycklar. I den andra utdatan valde kopplingsoperatorn slumpmässigt den andra nyckeln som visas i t1, med värdet "val1.2" och matchade den med t2-nycklar.

let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3",
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key

utdata

nyckel värde key1 value1
1 val1.1 1 val1.3
1 val1.1 1 val1.4
let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3", 
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key

utdata

nyckel värde key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto är optimerad för att skicka filter som kommer efter join, mot lämplig kopplingssida, vänster eller höger, när det är möjligt.
  • Ibland är den smak som används innerunique och filtret sprids till vänster sida av kopplingen. Smaken sprids automatiskt och nycklarna som gäller för filtret visas i utdata.
  • Använd föregående exempel och lägg till ett filter where value == "val1.2" . Det ger det andra resultatet och ger aldrig det första resultatet för datauppsättningarna:
let t1 = datatable(key: long, value: string)  
    [
    1, "val1.1",  
    1, "val1.2"  
];
let t2 = datatable(key: long, value: string)  
    [  
    1, "val1.3", 
    1, "val1.4"  
];
t1
| join kind = innerunique
    t2
    on key
| where value == "val1.2"

utdata

nyckel värde key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Hämta utökade inloggningsaktiviteter

Hämta utökade aktiviteter från en login som vissa poster markerar som början och slutet av en aktivitet.

let Events = MyLogTable | where type=="Event" ;
Events
| where Name == "Start"
| project Name, City, ActivityId, StartTime=timestamp
| join (Events
    | where Name == "Stop"
        | project StopTime=timestamp, ActivityId)
    on ActivityId
| project City, ActivityId, StartTime, StopTime, Duration = StopTime - StartTime
let Events = MyLogTable | where type=="Event" ;
Events
| where Name == "Start"
| project Name, City, ActivityIdLeft = ActivityId, StartTime=timestamp
| join (Events
        | where Name == "Stop"
        | project StopTime=timestamp, ActivityIdRight = ActivityId)
    on $left.ActivityIdLeft == $right.ActivityIdRight
| project City, ActivityId, StartTime, StopTime, Duration = StopTime - StartTime