operator join

Gabungkan baris dua tabel untuk membentuk tabel baru dengan mencocokkan nilai kolom yang ditentukan dari setiap tabel.

Table1 | join (Table2) on CommonColumn, $left.Col1 == $right.Col2

Sintaks

LeftTable|join [JoinParameters] (RightTable)onAtribut

Argumen

  • LeftTable: Tabel kiri atau ekspresi tabular, kadang-kadang disebut tabel luar, yang barisnya akan digabungkan. Dilambangkan sebagai $left.

  • RightTable: Tabel kanan atau ekspresi tabular, kadang-kadang disebut tabel dalam, yang barisnya akan digabungkan. Dilambangkan sebagai $right.

  • Atribut: Satu atau beberapa aturan terpisah koma yang menjelaskan bagaimana baris dari LeftTable dicocokkan dengan baris dari RightTable. Beberapa aturan dievaluasi menggunakan operator logis and.

    aturan menjadi sala satu dari:

    Jenis aturan Sintaks Predikat
    Kesetaraan dengan nama ColumnName whereLeftTable.ColumnName==RightTable.ColumnName
    Kesetaraan berdasarkan nilai $left.LeftColumn==$right.RightColumn where$left.LeftColumn==$right.RightColumn

    Catatan

    Untuk 'kesetaraan berdasarkan nilai', nama kolom harus memenuhi syarat dengan tabel pemilik yang berlaku yang dilambangkan dengan notasi $left dan $right.

  • JoinParameters: Nol atau lebih parameter yang dipisahkan oleh ruang dalam bentuk Nama=Nilai yang mengontrol operasi pencocokan baris dan rencana eksekusi. Parameter berikut didukung oleh:

    Nama parameter Nilai Deskripsi
    kind Rasa gabungan Lihat Rasa Gabungan
    hint.remote auto, left, local, right Lihat Gabungan Lintas Kluster
    hint.strategy=broadcast Menentukan cara berbagi beban kueri pada node kluster. Lihat gabungan siaran
    hint.shufflekey=<key> Kueri shufflekey membagikan muatan kueri pada node kluster, menggunakan kunci ke data partisi. Lihat kueri acak
    hint.strategy=shuffle Kueri strategi shuffle membagikan muatan kueri pada node kluster, di mana setiap simpul akan memproses satu partisi data. Lihat kueri acak
    Nama Nilai Deskripsi
    kind Rasa gabungan Lihat Rasa Gabungan
    hint.remote auto, left, local, right
    hint.strategy=broadcast Menentukan cara berbagi beban kueri pada node kluster. Lihat gabungan siaran
    hint.shufflekey=<key> Kueri shufflekey membagikan muatan kueri pada node kluster, menggunakan kunci ke data partisi. Lihat kueri acak
    hint.strategy=shuffle Kueri strategi shuffle membagikan muatan kueri pada node kluster, di mana setiap simpul akan memproses satu partisi data. Lihat kueri acak

Peringatan

Jika kind tidak ditentukan, rasa gabungan default adalah innerunique. Ini berbeda dari beberapa produk analitik lain yang memiliki inner sebagai rasa default. Lihat rasa gabungan untuk memahami perbedaan dan pastikan kueri menghasilkan hasil yang ditangguhkan.

Mengembalikan

Skema output tergantung pada rasa gabungan:

Rasa gabungan Skema output
kind=leftanti, kind=leftsemi Tabel hasil hanya berisi kolom dari sisi kiri.
kind=rightanti, kind=rightsemi Tabel hasil hanya berisi kolom dari sisi kanan.
kind=innerunique, kind=inner, kind=leftouter, kind=rightouter, kind=fullouter Kolom untuk setiap kolom di masing-masing dari dua tabel, termasuk kunci yang cocok. Kolom sisi kanan akan diganti namanya secara otomatis jika ada bentrokan nama.

Baris output bergantung pada rasa gabungan:

Catatan

Jika ada beberapa baris dengan nilai yang sama untuk bidang tersebut, Anda akan mendapatkan baris untuk semua kombinasi. Kecocokan adalah baris yang dipilih dari satu tabel yang memiliki nilai yang sama untuk semua bidang on sebagai baris di tabel lainnya.

Rasa gabungan Baris output
kind=leftanti, kind=leftantisemi Mengembalikan semua rekaman dari sisi kiri yang tidak memiliki kecocokan dari kanan
kind=rightanti, kind=rightantisemi Mengembalikan semua rekaman dari sisi kanan yang tidak memiliki kecocokan dari kiri.
kindTidak disebutkan, kind=innerunique Hanya satu baris dari sisi kiri yang cocok untuk setiap nilai kunci on. Output berisi baris untuk setiap kecocokan baris ini dengan baris dari kanan.
kind=leftsemi Mengembalikan semua rekaman dari sisi kiri yang tidak memiliki kecocokan dari kanan.
kind=rightsemi Mengembalikan semua rekaman dari sisi kanan yang memiliki kecocokan dari kiri.
kind=inner Mengembalikan semua baris yang cocok dari sisi kiri dan kanan.
kind=fullouter Mengembalikan semua baris untuk semua baris dari sisi kiri dan kanan. Sel yang tidak cocok berisi null.
kind=leftouter Mengembalikan semua baris dari sisi kiri dan hanya mencocokkan baris dari sisi kanan.
kind=rightouter Mengembalikan semua baris dari sisi kanan dan hanya mencocokkan baris dari sisi kiri.

Tip

Untuk performa terbaik, jika satu tabel selalu lebih kecil dari yang lain, gunakan sebagai sisi kiri (pipa) dari gabung.

Contoh

Dapatkan aktivitas diperpanjang dari login bahwa berapa entri ditandai sebagai awal dan akhir aktivitas.

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

Rasa gabungan

Rasa yang tepat dari operator gabungan ditentukan dengan kata kunci jenis. Rasa berikut dari operator gabungan didukung:

Jenis/rasa gabungan Deskripsi
innerunique (atau kosong sebagai default) Gabungan dalam dengan deduplikasi sisi kiri
inner Gabungan dalam standar
leftouter Gabungan luar kiri
rightouter Gabungan luar kanan
fullouter Gabungan luar penuh
leftanti, anti, atau leftantisemi Anti-gabungan kiri
rightanti atau rightantisemi Anti-gabungan kanan
leftsemi Semi-gabungan kiri
rightsemi Semi-gabungan kanan

Rasa gabunganan default

Rasa gabungan default adalah gabungan dalam dengan deduplikasi sisi kiri. Implementasi gabungan default berguna dalam skenario analisis log/jejak khusus tempat Anda ingin menghubungkan dua peristiwa, masing-masing mencocokkan beberapa kriteria pemfilteran, di bawah ID korelasi yang sama. Anda ingin mendapatkan kembali semua penampilan fenomena, dan mengabaikan beberapa penampilan dari baris jejak yang berkontribusi.

X | join Y on Key
 
X | join kind=innerunique Y on Key

Dua tabel sampel berikut digunakan untuk menjelaskan pengoperasian gabung.

Tabel X

Kunci Nilai1
a 1
b 2
b 3
c 4

Tabel Y

Kunci Nilai2
b 10
c 20
c 30
d 40

Gabungan default melakukan gabungan dalam setelah menguraikan sisi kiri pada kunci gabungan (deduplikasi menyimpan baris pertama).

Dengan pernyataan ini: X | join Y on Key

sisi kiri yang efektif dari gabungan, tabel X setelah deduplikasi, adalah:

Kunci Nilai1
a 1
b 2
c 4

dan hasil dari gabungan adalah:

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
Kunci Nilai1 Kunci1 Nilai2
b 2 b 10
c 4 c 20
c 4 c 30

Catatan

Kunci 'a' dan 'd' tidak muncul dalam output, karena tidak ada kunci yang cocok di sisi kiri dan kanan.

Rasa gabungan dalam

Fungsi gabungan dalam seperti gabungan dalam standar dari dunia SQL. Baris output dihasilkan setiap kali baris di sisi kiri memiliki kunci gabungan yang sama dengan baris di sisi kanan.

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 kind=inner Y on Key
Kunci Nilai1 Kunci1 Nilai2
b 3 b 10
b 2 b 10
c 4 c 20
c 4 c 30

Catatan

  • (b,10) dari sisi kanan, gabungan dua kali: dengan keduanya (b,2) dan (b,3) di sebelah kiri.
  • (c,4) di sisi kiri, gabungan dua kali: dengan keduanya (c,20) dan (c,30) di sebelah kanan.

Rasa innerunique-join

Gunakan rasa innerunique-join untuk mengurai kunci dari sisi kiri. Hasilnya akan menjadi baris dalam output dari setiap kombinasi tombol kiri dan tombol kanan yang dideduplikasi.

Catatan

Rasa innerunique dapat menangguhkan dua output yang mungkin dan keduanya benar. Pada output pertama, operator gabungan secara acak memilih kunci pertama yang muncul di t1, dengan nilai "val1.1" dan mencocokkannya dengan tombol t2. Pada output kedua, operator gabungan secara acak memilih kunci kedua yang muncul di t1, dengan nilai "val1.2" dan mencocokkannya dengan tombol t2.

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
kunci nilai 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
kunci nilai key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4
  • Kusto dioptimalkan untuk mendorong filter yang datang setelah join, menuju sisi gabungan yang sesuai, kiri atau kanan, bila memungkinkan.

  • Terkadang, rasa yang digunakan adalah innerunique dan filter diperbanyak ke sisi kiri gabung. Rasa akan diperbanyak secara otomatis dan kunci yang berlaku untuk filter itu akan selalu muncul dalam output.

  • Gunakan contoh di atas dan tambahkan filter where value == "val1.2" . Itu akan selalu memberikan hasil kedua dan tidak akan pernah memberikan hasil pertama untuk himpunan data:

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"
kunci nilai key1 value1
1 val1.2 1 val1.3
1 val1.2 1 val1.4

Rasa gabungan luar kiri

Hasil gabungan luar kiri untuk tabel X dan Y selalu berisi semua baris tabel kiri (X), bahkan jika kondisi gabungan tidak menemukan baris yang cocok di tabel kanan (Y).

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 kind=leftouter Y on Key
Kunci Nilai1 Kunci1 Nilai2
a 1
b 2 b 10
b 3 b 10
c 4 c 20
c 4 c 30

Rasa gabungan luar yang tepat

Rasa gabungan luar kanan menyerupai gabungan luar kiri, tetapi perlakuan tabel dibalik.

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 kind=rightouter Y on Key
Kunci Nilai1 Kunci1 Nilai2
b 2 b 10
b 3 b 10
c 4 c 20
c 4 c 30
d 40

Rasa gabungan luar penuh

Gabungan luar penuh menggabungkan efek menerapkan gabungan luar kiri dan kanan. Setiap kali baris dalam tabel yang digabungkan tidak cocok, hasil akan memiliki nilai null untuk setiap kolom tabel yang tidak memiliki baris yang cocok. Untuk baris yang cocok, satu baris akan dihasilkan dalam hasil, yang berisi bidang yang diisi dari kedua tabel.

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 kind=fullouter Y on Key
Kunci Nilai1 Kunci1 Nilai2
a 1
b 2 b 10
b 3 b 10
c 4 c 20
c 4 c 30
d 40

Rasa anti gabungan kiri

Anti gabungan kiri mengembalikan semua baris dari sisi kiri yang tidak cocok dengan baris apa pun dari sisi kanan.

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 kind=leftanti Y on Key
Kunci Nilai1
a 1

Catatan

Anti gabungan memodelkan kueri "TIDAK DALAM".

Rasa anti gabungan yang tepat

Anti gabungan kanan mengembalikan semua baris dari sisi kanan yang tidak cocok dengan baris apa pun dari sisi kiri.

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 kind=rightanti Y on Key
Kunci Nilai2
d 40

Catatan

Antigabungan memodelkan kueri "TIDAK DALAM".

Rasa semi gabungan kiri

Semi gabungan kiri mengembalikan semua baris dari sisi kiri yang cocok dengan baris dari sisi kanan. Hanya kolom dari sisi kiri yang dikembalikan.

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 kind=leftsemi Y on Key
Kunci Nilai1
b 2
b 3
c 4

Rasa semi gabungan yang tepat

Semi gabungan kanan mengembalikan semua baris dari sisi kanan yang cocok dengan baris dari sisi kiri. Hanya kolom dari sisi kanan yang dikembalikan.

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 kind=rightsemi Y on Key
Kunci Nilai2
b 10
c 20
c 30

Gabungan lintas

Kusto tidak secara asli menyediakan rasa gabungan lintas. Anda tidak dapat menandai operator dengan kind=cross. Untuk menyimulasikan, gunakan kunci dummy.

X | extend dummy=1 | join kind=inner (Y | extend dummy=1) on dummy

Petunjuk gabungan

Operator join mendukung sejumlah petunjuk yang mengontrol cara kueri berjalan. Petunjuk ini tidak mengubah semantik join, tetapi dapat mempengaruhi performanya.

Petunjuk gabungan dijelaskan dalam artikel berikut: