join işleci
Her tablodaki belirtilen sütunların değerlerini eşleştirerek yeni bir tablo oluşturmak için iki tablonun satırlarını birleştirin.
Table1 | join (Table2) on CommonColumn, $left.Col1 == $right.Col2
Syntax
LeftTablejoin
[join
] (
(
)
on
)
Bağımsız değişkenler
LeftTable: Satırları birleştirilecek olan dış tablo olarak da adlandırılan sol tablo veya tablo ifadesi. olarak ifade edildi
$left
.RightTable: Satırları birleştirilecek olan iç tablo olarak da adlandırılan doğru tablo veya tablo ifadesi. olarak ifade edildi
$right
.Öznitelikler: LeftTable'dan satırların RightTable'dan satırlara nasıl eş olduğunu açıklayan bir veya daha fazla virgülle ayrılmış kural. Mantıksal işleç kullanılarak birden çok kural
and
değerlendirilir.Bir kural şu kurallardan biri olabilir:
Kural tür Syntax Yüklemi Ad ile eşitlik Columnname where
where
. ColumnnameRightTable. ColumnnameDeğere göre eşitlik $left.
$left.
==
$right.
==
where
$left.
where
==
$right.
$left.
Not
'Değere göre eşitlik' için sütun adlarının ve notlarının yer alan ilgili sahip tablosuyla uygun olması
$right
gerekir.JoinParameters: Satır eşleşmesi işlemi ve yürütme planının davranışını kontrol altına alan NameValue şeklinde sıfır veya daha fazla boşlukla ayrılmış parametre. Aşağıdaki parametreler de destekleni:
Parametre adı Değerler Açıklama kind
Birleşim aromaları Bkz . Birleştirme Aromaları hint.remote
auto
,left
,local
,right
Bkz . Kümeler Arası Birleştirme hint.strategy=broadcast
Küme düğümlerde sorgu yükünü paylaşmanın yolunu belirtir. Bkz . yayına katılma hint.shufflekey=<key>
Sorgu shufflekey
, verileri bölümleme anahtarı kullanarak küme düğümleri üzerindeki sorgu yükünü paylaşıyor.Bkz . karıştırma sorgusu hint.strategy=shuffle
Strateji shuffle
sorgusu, her düğümün verilerin bir bölümünü işleyeceğiz küme düğümleri üzerindeki sorgu yükünü paylaşıyor.Bkz . karıştırma sorgusu Name Değerler Açıklama kind
Birleşim aromaları Bkz . Birleştirme Aromaları hint.remote
auto
,left
,local
,right
hint.strategy=broadcast
Küme düğümlerde sorgu yükünü paylaşmanın yolunu belirtir. Bkz . yayına katılma hint.shufflekey=<key>
Sorgu shufflekey
, verileri bölümleme anahtarı kullanarak küme düğümleri üzerindeki sorgu yükünü paylaşıyor.Bkz . karıştırma sorgusu hint.strategy=shuffle
Strateji shuffle
sorgusu, her düğümün verilerin bir bölümünü işleyeceğiz küme düğümleri üzerindeki sorgu yükünü paylaşıyor.Bkz . karıştırma sorgusu
Uyarı
Belirtilmezse kind
, varsayılan birleştirme aroması olur innerunique
. Bu, varsayılan aromaya sahip olan diğer analiz inner
ürünlerinden farklıdır. Farkları anlamak ve sorgunun amaçlanan sonuçları elde etmek için birleştirme aromalarına bakın.
Döndürülenler
Çıkış şeması, birleştirme türüne bağlıdır:
Birleştirme aroması | Çıkış şeması |
---|---|
kind=leftanti , kind=leftsemi |
Sonuç tablosu yalnızca sol taraftan sütunlar içerir. |
kind=rightanti , kind=rightsemi |
Sonuç tablosu yalnızca sağ taraftan sütunlar içerir. |
kind=innerunique , kind=inner , kind=leftouter , kind=rightouter , kind=fullouter |
Eşleşen anahtarlar da dahil olmak üzere iki t tablodaki her sütun için bir sütun. Adla ilgili bir sorun olursa sağ tarafındaki sütunlar otomatik olarak yeniden adlandırılır. |
Çıkış kayıtları birleştirme türüne bağlıdır:
Not
Bu alanlar için aynı değerlere sahip birkaç satır varsa, tüm birleşimler için satırlar elde edersiniz.
Eşleşme, bir tablodan seçilen ve diğer tablodaki tüm alanlar için on
aynı değere sahip olan bir satırdır.
Birleştirme aroması | Çıkış kayıtları |
---|---|
kind=leftanti , kind=leftantisemi |
Sol taraftan sağ tarafta eşleşmesi olan tüm kayıtları döndürür |
kind=rightanti , kind=rightantisemi |
Sol taraftan eşleşmesi olan sağ taraftan tüm kayıtları döndürür. |
kind Belirtilme -miş kind=innerunique |
Anahtarın her değeri için sol taraftan yalnızca bir satır eştir on . Çıkış, bu satırın her eşleşmesi için sağdan satır içeren bir satır içerir. |
kind=leftsemi |
Sol taraftan sağ tarafta eşleşen tüm kayıtları döndürür. |
kind=rightsemi |
Sol taraftan eşleşen sağ taraftan tüm kayıtları döndürür. |
kind=inner |
Sol ve sağ kenarlardan eşleşen tüm kayıtları döndürür. |
kind=fullouter |
Sol ve sağ kenarlarından tüm kayıtların tüm kayıtlarını döndürür. Eşleşmeyen hücreler null değerler içerir. |
kind=leftouter |
Sol taraftan tüm kayıtları ve yalnızca sağ taraftan eşleşen kayıtları döndürür. |
kind=rightouter |
Sağ taraftan tüm kayıtları ve yalnızca sol taraftan eşleşen kayıtları döndürür. |
İpucu
En iyi performans için, bir tablo her zaman diğer tablodan küçükse, birleştirmenin sol (kanallı) tarafı olarak kullanın.
Örnek
Bazı girdilerin etkinliğin başlangıcı login
ve sonu olarak işaret eden genişletilmiş etkinlikleri bir'den al.
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
Birleşim aromaları
Join işlecinin tam aroması kind anahtar sözcüğüyle belirtilir. Birleştirme işlecinin aşağıdaki çeşitler de destekleni:
Tür/aromayı birleştirme | Description |
---|---|
innerunique (veya varsayılan olarak boş) |
Sol tarafta tekrarlama ile iç birleşim |
inner |
Standart iç birleşim |
leftouter |
Sol dış birleştirme |
rightouter |
Sağ dış birleştirme |
fullouter |
Tam dış birleştirme |
leftanti , anti veya leftantisemi |
Sol ters birleştirme |
rightanti veya rightantisemi |
Sağ ters birleştirme |
leftsemi |
Sol yarı birleşim |
rightsemi |
Sağ yarı ekleme |
Varsayılan JOIN türü
Varsayılan birleşim, sol taraftaki yinelenenleri kaldırma ile bir iç birleşimdir. Varsayılan JOIN uygulama, her biri aynı bağıntı KIMLIĞI altında olan her filtreleme ölçütüyle eşleşen iki olayı ilişkilendirmek istediğiniz tipik günlük/izleme çözümleme senaryolarında faydalıdır. Phenomenon 'un tüm görünümlerini geri almak ve katkıda bulunan izleme kayıtlarının birden çok görünümünü yoksaymak istiyorsunuz.
X | join Y on Key
X | join kind=innerunique Y on Key
Aşağıdaki iki örnek tablo, birleştirmenin işlemini açıklamak için kullanılır.
Tablo X
Anahtar | Value1 |
---|---|
a | 1 |
b | 2 |
b | 3 |
c | 4 |
Tablo Y
Anahtar | Value2 |
---|---|
b | 10 |
c | 20 |
c | 30 |
d | 40 |
Varsayılan birleşim, birleşim anahtarındaki sol tarafı çoğaltdıktan sonra bir iç birleşim yapar (yinelenenleri kaldırma ilk kaydı korur).
Bu bildirimde verilen: X | join Y on Key
birleştirmenin etkin sol tarafı, yinelenenleri kaldırma işleminden sonra tablo X şöyle olacaktır:
Anahtar | Value1 |
---|---|
a | 1 |
b | 2 |
c | 4 |
ve birleştirmenin sonucu şöyle olacaktır:
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
Anahtar | Value1 | KEY1 | Value2 |
---|---|---|---|
b | 2 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
Not
Hem sol hem de sağ tarafta eşleşen bir anahtar olmadığından, çıktıda ' a ' ve ' a ' anahtarları görünmüyor.
İç birleşim türü
iç birleşim işlevi, SQL dünyadan standart iç birleşim gibidir. Sol taraftaki bir kayıt, sağ taraftaki kayıtla aynı JOIN anahtarına sahip olduğunda bir çıkış kaydı oluşturulur.
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
Anahtar | Value1 | KEY1 | Value2 |
---|---|---|---|
b | 3 | b | 10 |
b | 2 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
Not
- sağ taraftaki (b, 10), sol tarafta iki kez birleştirildi: (b, 2) ve (b, 3).
- (c, 4) sol tarafta iki kez birleştirildi: sağdaki (c, 20) ve (c, 30).
Innerunique-JOIN türü
Sol taraftaki anahtarları yinelenenleri kaldırma için ınnerunique-JOIN özelliğini kullanın. Sonuç, yinelenenleri kaldırılmış sol anahtarların ve sağ anahtarların her birleşiminin çıktısındaki bir satır olacaktır.
Not
ınnerunique Flavor iki olası çıkış ve her ikisi de doğru olabilir. İlk çıktıda, JOIN işleci "Val 1.1" değeriyle ve bunu T2 ile eşleştirildiği T1 'da görünen ilk anahtarı rastgele olarak seçti. İkinci çıktıda, JOIN işleci "Val 1.2" değeriyle ve bunu T2 ile eşleştirildiği şekilde T1 'da görünen ikinci anahtarı rastgele seçti.
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
anahtar | değer | key1 | value1 |
---|---|---|---|
1 | Val 1.1 | 1 | değer 1.3 |
1 | Val 1.1 | 1 | Val 1.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
anahtar | değer | key1 | value1 |
---|---|---|---|
1 | değer 1.2 | 1 | değer 1.3 |
1 | değer 1.2 | 1 | Val 1.4 |
Kusto, mümkün olduğunda, doğru bir JOIN tarafına, sola veya sağa doğru bir şekilde gelen
join
filtreleri göndermek için en iyi duruma getirilmiştir.Bazen kullanılan Flavor innerunique , filtre ise birleştirmenin sol tarafına yayılır. Özellik otomatik olarak yayılır ve bu filtreye uygulanan anahtarlar her zaman çıktıda görüntülenir.
Yukarıdaki örneği kullanın ve bir filtre
where value == "val1.2"
ekleyin. Her zaman ikinci sonuca sahiptir ve veri kümelerinin ilk sonucunu hiçbir zaman vermeymez:
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"
anahtar | değer | key1 | value1 |
---|---|---|---|
1 | değer 1.2 | 1 | değer 1.3 |
1 | değer 1.2 | 1 | Val 1.4 |
Sol dış birleşim türü
X ve Y tabloları için bir sol dış birleştirmenin sonucu her zaman sol tablonun (X) tüm kayıtlarını içerir, bu da birleşim koşulu doğru tabloda (Y) eşleşen bir kayıt bulmasa bile.
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
Anahtar | Value1 | KEY1 | Value2 |
---|---|---|---|
a | 1 | ||
b | 2 | b | 10 |
b | 3 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
Sağ dış birleşim türü
Sağ dış birleşim, sol dış birleşime benzer ancak tablo işleme tersine çevrilir.
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
Anahtar | Value1 | KEY1 | Value2 |
---|---|---|---|
b | 2 | b | 10 |
b | 3 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
d | 40 |
Tam dış birleşim türü
Tam dış birleşim, hem sol hem de sağ dış birleşimler uygulamanın etkisini birleştirir. Birleştirilen tablolardaki kayıtlar eşleşmediğinden, sonuç kümesinde eşleşen bir satır olmayan tablonun her sütunu için değerler olacaktır null
. Eşleşen kayıtlar için, her iki tablodan doldurulmuş alanları içeren sonuç kümesinde tek bir satır oluşturulur.
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
Anahtar | Value1 | KEY1 | Value2 |
---|---|---|---|
a | 1 | ||
b | 2 | b | 10 |
b | 3 | b | 10 |
c | 4 | c | 20 |
c | 4 | c | 30 |
d | 40 |
Sol birleşimden koruma aroması
Sol anti-join, sol taraftan sağ taraftan hiçbir kayıtla eşleşmeden tüm kayıtları döndürür.
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
Anahtar | Değer1 |
---|---|
a | 1 |
Not
Birleştirmeye karşı koruma, "NOT IN" sorgusunu modeller.
Sağ birleşimden koruma aroması
Sağ birleşimden koruma, sağ taraftan sol taraftan hiçbir kayıtla eşleşmeden tüm kayıtları döndürür.
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
Anahtar | Değer2 |
---|---|
d | 40 |
Not
Birleştirmeye karşı koruma, "NOT IN" sorgusunu modeller.
Sol yarı birleşim aroması
Sol yarı birleştirme, sol taraftan sağ taraftan bir kayıtla eşan tüm kayıtları döndürür. Yalnızca sol taraftan sütunlar döndürülür.
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
Anahtar | Değer1 |
---|---|
b | 2 |
b | 3 |
c | 4 |
Sağ yarı birleşim aroması
Sağ noktalı birleşim, sağ taraftan sol taraftan bir kayıtla eşan tüm kayıtları döndürür. Yalnızca sağ taraftan sütunlar döndürülür.
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
Anahtar | Değer2 |
---|---|
b | 10 |
c | 20 |
c | 30 |
Çapraz birleştirme
Kusto yerel olarak çapraz birleşim aroması sağlamaz. işleci ile işaretleyesiniz kind=cross
.
Simülasyon yapmak için sahte bir anahtar kullanın.
X | extend dummy=1 | join kind=inner (Y | extend dummy=1) on dummy
Birleştirme ipuçları
işleci join
, bir sorgunun nasıl çalıştırılır denetlemesi için bir dizi ipucunu destekler.
Bu ipuçları, semantiği değiştirmez join
, ancak performansını etkileyebilir.
Birleştirme ipuçları aşağıdaki makalelerde açıklanmıştır:
hint.shufflekey=<key>
vehint.strategy=shuffle
-hint.shufflekey=<key>
hint.strategy=broadcast
-hint.strategy=broadcast
hint.remote=<strategy>
-hint.remote=<strategy>