Delen via


innerunique join

De innerunique join-smaak verwijdert dubbele sleutels aan de linkerkant. Dit gedrag zorgt ervoor dat de uitvoer een rij bevat voor elke combinatie van unieke linker- en rechtertoetsen.

Standaard wordt de innerunique join-smaak gebruikt als de kind parameter niet is opgegeven. Deze standaard implementatie is handig in logboek-/traceringsanalysescenario's, waarbij u twee gebeurtenissen wilt correleren op basis van een gedeelde correlatie-id. Hiermee kunt u alle exemplaren van het fenomeen ophalen zonder dubbele traceringsrecords te negeren die bijdragen aan de correlatie.

Diagram dat laat zien hoe de join werkt.

Syntax

LeftTable|joinkind=innerunique [ Hints ] RechtstabelonVoorwaarden

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
LeftTable string ✔️ De linkertabel of tabelvormige expressie, ook wel de buitenste tabel genoemd, waarvan de rijen moeten worden samengevoegd. Aangeduid als $left.
Hints string Nul of meer door spaties gescheiden joinhints in de vorm van Naamwaarde= die het gedrag van de rijovereenkomst en het uitvoeringsplan bepalen. Zie Hints voor meer informatie.
Rechtstabel string ✔️ De rechtertabel of tabellaire expressie, ook wel de binnenste tabel genoemd, waarvan de rijen moeten worden samengevoegd. Aangeduid als $right.
Voorwaarden string ✔️ Bepaalt hoe rijen van LeftTable worden vergeleken met rijen uit RightTable. Als de kolommen die u wilt vergelijken dezelfde naam hebben in beide tabellen, gebruikt u de syntaxis ONColumnName. Gebruik anders de syntaxis ON $left.LeftColumn==$right.RightColumn. Als u meerdere voorwaarden wilt opgeven, kunt u het trefwoord 'en' gebruiken of deze scheiden met komma's. Als u komma's gebruikt, worden de voorwaarden geëvalueerd met behulp van de logische operator 'en'.

Tip

Als de ene tabel altijd kleiner is dan de andere, gebruikt u deze als de linkerkant van de join voor de beste prestaties.

Hints

Naam van parameters Waarden Beschrijving
hint.remote auto, left, local, right Zie Join tussen clusters
hint.strategy=broadcast Hiermee geeft u de manier op om de querybelasting op clusterknooppunten te delen. Zie broadcast join
hint.shufflekey=<key> De shufflekey query deelt de querybelasting op clusterknooppunten met behulp van een sleutel om gegevens te partitioneren. Bekijk willekeurige query
hint.strategy=shuffle De shuffle strategiequery deelt de querybelasting op clusterknooppunten, waarbij elk knooppunt één partitie van de gegevens verwerkt. Bekijk willekeurige query

Retouren

Schema: alle kolommen uit beide tabellen, inclusief de overeenkomende sleutels.
Rijen: alle ontdubbelde rijen uit de linkertabel die overeenkomen met rijen uit de rechtertabel.

Voorbeelden

De standaard innerunique join gebruiken

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

Uitvoer

Sleutel Waarde1 Sleutel1 Waarde2
b 2 b 10
c 4 c 20
c 4 c 30

Notitie

De toetsen 'a' en 'd' worden niet weergegeven in de uitvoer, omdat er links en rechts geen overeenkomende sleutels waren.

De query heeft de standaard join uitgevoerd. Dit is een inner join na het ontdubbelen van de linkerkant op basis van de joinsleutel. Bij ontdubbeling blijft alleen de eerste record behouden. De resulterende linkerkant van de join na ontdubbeling is:

Sleutel Waarde1
een 1
b 2
c 4

Twee mogelijke uitvoerwaarden van innerunique join

Notitie

De innerunique join-smaak kan twee mogelijke uitvoer opleveren en beide zijn correct. In de eerste uitvoer heeft de join-operator willekeurig de eerste sleutel geselecteerd die wordt weergegeven in t1, met de waarde 'val1.1' en deze overeenkomen met t2-sleutels. In de tweede uitvoer heeft de join-operator willekeurig de tweede sleutel geselecteerd die wordt weergegeven in t1, met de waarde 'val1.2' en deze overeenkomen met t2-sleutels.

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

Uitvoer

sleutel waarde key1 waarde1
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

Uitvoer

sleutel waarde key1 waarde1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto is geoptimaliseerd voor het pushen van filters die na de joinkomen, naar de juiste joinzijde, links of rechts, indien mogelijk.
  • Soms is de gebruikte smaak innerunique en wordt het filter doorgegeven aan de linkerkant van de join. De smaak wordt automatisch doorgegeven en de sleutels die van toepassing zijn op dat filter worden weergegeven in de uitvoer.
  • Gebruik het vorige voorbeeld en voeg een filter where value == "val1.2" toe. Het geeft het tweede resultaat en geeft nooit het eerste resultaat voor de gegevenssets:
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"

Uitvoer

sleutel waarde key1 waarde1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Uitgebreide aanmeldingsactiviteiten ophalen

Uitgebreide activiteiten ophalen van een login die sommige vermeldingen markeren als het begin en einde van een activiteit.

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