Thep Excel

JoinKind.Type – ระบุประเภทของการ Join ในตารางข้อมูล

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

By ThepExcel AI Agent
4 December 2025

Function Metrics


Popularity
6/10

Difficulty
2/10

Usefulness
6/10

Syntax & Arguments

=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 ตรงกันในตารางแรก (ไม่เพิ่มคอลัมน์จากตารางแรก)

Examples

ใช้ JoinKind.Inner เพื่อรวมเฉพาะข้อมูลที่ตรงกัน
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…
Inner Join แสดงเฉพาะแถวที่ ID ตรงกันในทั้งสองตาราง (Alice และ Bob) ข้ามี Charlie (ID=3) และ City Phuket (ID=4) ออกไปเพราะไม่มี ID ตรงกัน
Power Query Formula:

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

Result:

| ID | Name | City |
|----|---------|-----------|
| 1 | Alice | Bangkok |
| 2 | Bob | Chiang Mai|

ใช้ JoinKind.LeftOuter เพื่อเก็บข้อมูลจากตารางแรก
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…
LeftOuter Join เก็บแถวทั้งหมดจากตารางแรก (Table1) แถวของ Charlie (ID=3) คงอยู่ แต่ City เป็น null เพราะไม่มีข้อมูลตรงกันในตารางที่สอง
Power Query Formula:

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

Result:

| ID | Name | City |
|----|---------|-------------|
| 1 | Alice | Bangkok |
| 2 | Bob | Chiang Mai |
| 3 | Charlie | null |

ใช้ JoinKind.LeftAnti เพื่อหาข้อมูลที่ไม่ตรงกัน
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…
LeftAnti Join แสดงแถวจากตารางแรกที่ไม่มี ID ตรงกันในตารางที่สอง เฉพาะ Charlie (ID=3) เท่านั้น ที่ไม่มีข้อมูล City
Power Query Formula:

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

Result:

| ID | Name |
|----|----------|
| 3 | Charlie |

ใช้ JoinKind.FullOuter เพื่อรวมข้อมูลทั้งหมด
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…
FullOuter Join เก็บข้อมูลทั้งหมดจากทั้งสองตาราง Charlie และ Phuket (ID=4) ไม่มีการจับคู่จึงมี null
Power Query Formula:

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

Result:

| ID | Name | City |
|----|---------|-------------|
| 1 | Alice | Bangkok |
| 2 | Bob | Chiang Mai |
| 3 | Charlie | null |
| 4 | null | Phuket |

FAQs

ผมต้องใช้ JoinKind ประเภทไหนเวลาต้องการเก็บข้อมูลจากตารางหลักไว้ทั้งหมด?

ใช้ JoinKind.LeftOuter ค่ะ มันเก็บแถวทั้งหมดจากตารางแรก (ตารางหลัก) แล้วเพิ่มข้อมูลจากตารางที่สอง ถ้าไม่มีข้อมูลตรงกันก็จะ null ซึ่งผมใช้วิธีนี้บ่อยที่สุดในงานประจำวัน

ความแตกต่างระหว่าง JoinKind.LeftAnti และ JoinKind.LeftSemi คืออะไร?

ผมอธิบายแบบง่ายๆ ค่ะ: LeftAnti คือหาแถวที่ “ไม่ตรงกัน” (ข้อมูลที่หาย) ส่วน LeftSemi คือหาแถวที่ “ตรงกัน” (ข้อมูลที่มี) ทั้งสองแบบไม่ได้เพิ่มคอลัมน์จากตารางที่สอง เลย เอาไว้กรองข้อมูลเท่านั้น

ผมจะรู้ได้ยังไงว่าต้องใช้ JoinKind ประเภไหน?

ส่วนตัวผม มีวิธีง่ายๆ: ถ้าอยากเก็บข้อมูลจากตารางไหนไว้ทั้งหมด ให้ใช้ LeftOuter (ตารางแรก) หรือ RightOuter (ตารางที่สอง) ถ้าอยากรวมทั้งหมด ใช้ FullOuter ถ้าอยากหาข้อมูลที่ไม่ตรงกัน ใช้ Anti

Resources & Related

Additional Notes

JoinKind.Type เป็น enumeration ที่ใช้ในฟังก์ชัน Table.Join เพื่อระบุประเภทของการ Join ว่าจะรวมแถวจากตารางสองตารางแบบไหน ตั้งแต่ Inner Join ที่เอาแค่ข้อมูลที่ตรงกัน ไปจนถึง Anti/Semi Join ที่ใช้สำหรับการกรองและวิเคราะห์ข้อมูล

ที่เจ๋งคือ JoinKind.Type มี 8 ประเภท (0-7) ครอบคลุมทุกสถานการณ์การรวมตาราง ตั้งแต่ต้องการเก็บข้อมูลทั้งหมดหรือแค่ข้อมูลที่ตรงกัน ถึงการหาข้อมูลที่ไม่ตรงกัน ซึ่งช่วยให้ผม สามารถแก้ปัญหาข้อมูลซ้ำหรือหายโดยไม่ต้องใช้ฟังก์ชันเพิ่มเติม

ส่วนตัวผม มักใช้ JoinKind.LeftOuter บ่อยที่สุด เพราะมักจะอยากเก็บข้อมูลจากตารางหลักไว้ทั้งหมด แล้วเพิ่มข้อมูลเสริมจากตารางอื่น ส่วน JoinKind.LeftAnti และ JoinKind.RightAnti ใช้เมื่อต้องการหาข้อมูลที่ “ไม่ตรงกัน” ซึ่งมีประโยชน์ในการตรวจสอบข้อมูล 😎

Leave a Reply

Your email address will not be published. Required fields are marked *