Delen via


innerunique join

Van toepassing op: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel-

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 parameter kind niet is opgegeven. Deze standaard implementatie is handig in scenario's voor logboek-/traceringsanalyse, waarbij u twee gebeurtenissen wilt correleren op basis van een gedeelde correlatie-id. Hiermee kunt u alle exemplaren van het fenomeen ophalen terwijl u dubbele traceringsrecords negeert die bijdragen aan de correlatie.

diagram waarin wordt weergegeven hoe de join werkt.

Syntaxis

LeftTable|joinkind=innerunique [ Hints ] RightTableonVoorwaarden

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
LeftTable- string ✔️ De linkertabel of tabellaire 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 Naam=Waarde waarmee het gedrag van de bewerking en het uitvoeringsplan voor rijovereenkomsten wordt bepaald. Zie Hintsvoor meer informatie.
RightTable- 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 uit LeftTable- overeenkomen 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 scheiden met komma's. Als u komma's gebruikt, worden de voorwaarden geëvalueerd met behulp van de logische operator 'and'.

Fooi

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

Hints

Naam van parameters Waarden Beschrijving
hint.remote auto, left, local, right Zie voor meerdere 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. Zie query's in willekeurige volgorde
hint.strategy=shuffle De shuffle strategiequery deelt de querybelasting op clusterknooppunten, waarbij elk knooppunt één partitie van de gegevens verwerkt. Zie query's in willekeurige volgorde

Retourneert

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

Bekijk de voorbeelden en voer ze uit op uw Data Explorer-querypagina.

De standaard innerunique join gebruiken

De voorbeeldquery combineert rijen uit tabellen X en Y, waarbij de sleutels overeenkomen, waarbij alleen de rijen worden weergegeven die in beide tabellen voorkomen

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 sleutels 'a' en 'd' worden niet weergegeven in de uitvoer, omdat er geen overeenkomende sleutels aan beide linker- en rechterkant zijn.

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

Sleutel Waarde1
een 1
b 2
c 4

Twee mogelijke uitvoer van innerunique join

Notitie

De innerunique joinsmaak kan twee mogelijke uitvoer opleveren en beide zijn juist. In de eerste uitvoer heeft de join-operator willekeurig de eerste sleutel geselecteerd die in t1 wordt weergegeven, met de waarde 'val1.1' en deze overeenkomt 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 overeenkomt 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 wordt de gebruikte smaak innerunique en wordt het filter aan de linkerkant van de join doorgegeven. 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 toe where value == "val1.2" . 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 uit 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
  • Meer informatie over andere joins