JoinKind.Type คือ enum ที่ระบุประเภทของการ Join (Inner, Outer, Anti, Semi) เมื่อรวมตารางข้อมูลสองตาราง ใช้กับ Table.Join เพื่อควบคุมว่าแถวไหนจะปรากฏในผลลัพธ์
=JoinKind.Inner | JoinKind.LeftOuter | JoinKind.RightOuter | JoinKind.FullOuter | JoinKind.LeftAnti | JoinKind.RightAnti | JoinKind.LeftSemi | JoinKind.RightSemi
=JoinKind.Inner | JoinKind.LeftOuter | JoinKind.RightOuter | JoinKind.FullOuter | JoinKind.LeftAnti | JoinKind.RightAnti | JoinKind.LeftSemi | JoinKind.RightSemi
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| JoinKind.Inner | JoinKind Enum | Optional | แสดงแถวที่ key ตรงกันในทั้งสองตาราง | |
| JoinKind.LeftOuter | JoinKind Enum | Optional | เก็บแถวทั้งหมดจากตารางแรก แถวที่ไม่ตรงกันจากตารางที่สองจะ null | |
| JoinKind.RightOuter | JoinKind Enum | Optional | เก็บแถวทั้งหมดจากตารางที่สอง แถวที่ไม่ตรงกันจากตารางแรกจะ null | |
| JoinKind.FullOuter | JoinKind Enum | Optional | เก็บแถวทั้งหมดจากทั้งสองตาราง แถวที่ไม่ตรงกันจะมี null ในคอลัมน์ที่ไม่เกี่ยวข้อง | |
| JoinKind.LeftAnti | JoinKind Enum | Optional | แสดงแถวจากตารางแรกที่ไม่มี key ตรงกันในตารางที่สอง | |
| JoinKind.RightAnti | JoinKind Enum | Optional | แสดงแถวจากตารางที่สองที่ไม่มี key ตรงกันในตารางแรก | |
| JoinKind.LeftSemi | JoinKind Enum | Optional | แสดงแถวจากตารางแรกที่มี key ตรงกันในตารางที่สอง (ไม่เพิ่มคอลัมน์จากตารางที่สอง) | |
| JoinKind.RightSemi | JoinKind Enum | Optional | แสดงแถวจากตารางที่สองที่มี key ตรงกันในตารางแรก (ไม่เพิ่มคอลัมน์จากตารางแรก) |
let Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}), Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, C…let
Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}),
Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, City="Chiang Mai"], [ID=4, City="Phuket"]}),
Joined = Table.Join(Table1, {"ID"}, Table2, {"ID"}, JoinKind.Inner)
in
Joined
| ID | Name | City |
|----|---------|-----------|
| 1 | Alice | Bangkok |
| 2 | Bob | Chiang Mai|
let Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}), Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, C…let
Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}),
Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, City="Chiang Mai"], [ID=4, City="Phuket"]}),
Joined = Table.Join(Table1, {"ID"}, Table2, {"ID"}, JoinKind.LeftOuter)
in
Joined
| ID | Name | City |
|----|---------|-------------|
| 1 | Alice | Bangkok |
| 2 | Bob | Chiang Mai |
| 3 | Charlie | null |
let Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}), Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, C…let
Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}),
Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, City="Chiang Mai"], [ID=4, City="Phuket"]}),
Joined = Table.Join(Table1, {"ID"}, Table2, {"ID"}, JoinKind.LeftAnti)
in
Joined
| ID | Name |
|----|----------|
| 3 | Charlie |
let Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}), Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, C…let
Table1 = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"], [ID=3, Name="Charlie"]}),
Table2 = Table.FromRecords({[ID=1, City="Bangkok"], [ID=2, City="Chiang Mai"], [ID=4, City="Phuket"]}),
Joined = Table.Join(Table1, {"ID"}, Table2, {"ID"}, JoinKind.FullOuter)
in
Joined
| ID | Name | City |
|----|---------|-------------|
| 1 | Alice | Bangkok |
| 2 | Bob | Chiang Mai |
| 3 | Charlie | null |
| 4 | null | Phuket |
ใช้ JoinKind.LeftOuter ค่ะ มันเก็บแถวทั้งหมดจากตารางแรก (ตารางหลัก) แล้วเพิ่มข้อมูลจากตารางที่สอง ถ้าไม่มีข้อมูลตรงกันก็จะ null ซึ่งผมใช้วิธีนี้บ่อยที่สุดในงานประจำวัน
ผมอธิบายแบบง่ายๆ ค่ะ: LeftAnti คือหาแถวที่ “ไม่ตรงกัน” (ข้อมูลที่หาย) ส่วน LeftSemi คือหาแถวที่ “ตรงกัน” (ข้อมูลที่มี) ทั้งสองแบบไม่ได้เพิ่มคอลัมน์จากตารางที่สอง เลย เอาไว้กรองข้อมูลเท่านั้น
ส่วนตัวผม มีวิธีง่ายๆ: ถ้าอยากเก็บข้อมูลจากตารางไหนไว้ทั้งหมด ให้ใช้ LeftOuter (ตารางแรก) หรือ RightOuter (ตารางที่สอง) ถ้าอยากรวมทั้งหมด ใช้ FullOuter ถ้าอยากหาข้อมูลที่ไม่ตรงกัน ใช้ Anti
JoinKind.Type เป็น enumeration ที่ใช้ในฟังก์ชัน Table.Join เพื่อระบุประเภทของการ Join ว่าจะรวมแถวจากตารางสองตารางแบบไหน ตั้งแต่ Inner Join ที่เอาแค่ข้อมูลที่ตรงกัน ไปจนถึง Anti/Semi Join ที่ใช้สำหรับการกรองและวิเคราะห์ข้อมูล
ที่เจ๋งคือ JoinKind.Type มี 8 ประเภท (0-7) ครอบคลุมทุกสถานการณ์การรวมตาราง ตั้งแต่ต้องการเก็บข้อมูลทั้งหมดหรือแค่ข้อมูลที่ตรงกัน ถึงการหาข้อมูลที่ไม่ตรงกัน ซึ่งช่วยให้ผม สามารถแก้ปัญหาข้อมูลซ้ำหรือหายโดยไม่ต้องใช้ฟังก์ชันเพิ่มเติม
ส่วนตัวผม มักใช้ JoinKind.LeftOuter บ่อยที่สุด เพราะมักจะอยากเก็บข้อมูลจากตารางหลักไว้ทั้งหมด แล้วเพิ่มข้อมูลเสริมจากตารางอื่น ส่วน JoinKind.LeftAnti และ JoinKind.RightAnti ใช้เมื่อต้องการหาข้อมูลที่ “ไม่ตรงกัน” ซึ่งมีประโยชน์ในการตรวจสอบข้อมูล 😎