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.ColumnNameKesetaraan berdasarkan nilai $left.LeftColumn==$right.RightColumnwhere$left.LeftColumn==$right.RightColumnCatatan
Untuk 'kesetaraan berdasarkan nilai', nama kolom harus memenuhi syarat dengan tabel pemilik yang berlaku yang dilambangkan dengan notasi
$leftdan$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 kindRasa gabungan Lihat Rasa Gabungan hint.remoteauto,left,local,rightLihat Gabungan Lintas Kluster hint.strategy=broadcastMenentukan cara berbagi beban kueri pada node kluster. Lihat gabungan siaran hint.shufflekey=<key>Kueri shufflekeymembagikan muatan kueri pada node kluster, menggunakan kunci ke data partisi.Lihat kueri acak hint.strategy=shuffleKueri strategi shufflemembagikan muatan kueri pada node kluster, di mana setiap simpul akan memproses satu partisi data.Lihat kueri acak Nama Nilai Deskripsi kindRasa gabungan Lihat Rasa Gabungan hint.remoteauto,left,local,righthint.strategy=broadcastMenentukan cara berbagi beban kueri pada node kluster. Lihat gabungan siaran hint.shufflekey=<key>Kueri shufflekeymembagikan muatan kueri pada node kluster, menggunakan kunci ke data partisi.Lihat kueri acak hint.strategy=shuffleKueri strategi shufflemembagikan 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:
hint.shufflekey=<key>danhint.strategy=shuffle- kueri acakhint.strategy=broadcast- gabungan siaranhint.remote=<strategy>- gabungan lintas kluster