Thep Excel

Table.Joinรวมตารางแบบ SQL Join

Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join

fx
=Table.Join(table1, key1, table2, key2, [joinKind], [joinAlgorithm], [keyEqualityComparers]) as table

ความนิยม7/10
ความยาก5/10
ประโยชน์8/10

อัปเดต 3 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
table1 table ตารางแรก (ตารางซ้าย) – ตัวอักษรกำหนดว่าจะรักษาแถวจากตารางนี้ไว้ในจำนวนเท่าใด
key1 any คอลัมน์ key จากตารางแรก – สามารถระบุเป็น text เดี่ยว “ID” หรือ list หลายคอลัมน์ {“TenantID”, “CustomerID”}
table2 table ตารางที่สอง (ตารางขวา) – ตารางที่ต้องการรวมข้อมูลเข้า
key2 any คอลัมน์ key จากตารางที่สอง – ต้องตรงกันกับ key1 เพื่อจับคู่ข้อมูล
[joinKind]ไม่บังคับ number ประเภท join (JoinKind.Inner, JoinKind.LeftOuter, JoinKind.RightOuter, JoinKind.FullOuter, JoinKind.LeftAnti, JoinKind.RightAnti, JoinKind.LeftSemi, JoinKind.RightSemi) – ถ้าไม่ระบุจะเป็น JoinKind.Inner
[joinAlgorithm]ไม่บังคับ number อัลกอริทึมที่ใช้ในการ join (ใช้ต่อเมื่อต้องการปรับแต่ง performance – ใช้ไม่บ่อยนัก)
[keyEqualityComparers]ไม่บังคับ list รายการ equality comparer สำหรับการเปรียบเทียบค่า (ใช้ต่อเมื่อต้องการ case-insensitive หรือการเปรียบเทียบพิเศษ)

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

Table.Join ทำหน้าที่รวมตารางสองตารางเข้าด้วยกัน โดยจับคู่แถวตามค่าที่ตรงกันในคอลัมน์ key

ส่วนตัวผมใช้ Table.Join เวลาต้องรวมข้อมูลจากตารางที่มีความสัมพันธ์กัน เช่นรวมออเดอร์กับข้อมูลลูกค้า แล้วระบุว่า join แบบไหน (inner, left outer ฯลฯ) ตรงไปตรงมา ไม่ต้องยุ่งกับ conditional logic แบบ Table.SelectRows 😎

Examples

Inner Join – จับคู่ลูกค้ากับออเดอร์Table.Join( Customers, "CustomerID", Orders, "CustomerID", JoinKind.Inner )

รวมตารางสองตารางโดยจับคู่คอลัมน์ CustomerID ทั้งสองตาราง – ได้เฉพาะแถวที่มีค่า CustomerID ตรงกันในทั้งสองตาราง

fx
= Table.Join(
Customers,
"CustomerID",
Orders,
"CustomerID",
JoinKind.Inner
)

ผลลัพธ์ตารางที่รวมข้อมูลลูกค้า (Name, Phone) กับออเดอร์ (OrderID, Item, Price) – เฉพาะลูกค้าที่มีออเดอร์เท่านั้น
Left Outer Join – เก็บลูกค้าทั้งหมดlet Customers = Table.FromRecords({ [CustomerID = 1, Name = "Bob"], [CustomerID = 2, Name = "Alice"], [CustomerID = 3, Name = "Charlie"] }), Orders = Table.From…

Left Outer Join เก็บแถวทั้งหมดจากตารางซ้าย (Customers) และเพิ่มข้อมูลจากตารางขวา (Orders) ถ้ามี – ถ้าไม่มีการจับคู่ให้ null

fx
= let
Customers = Table.FromRecords({
[CustomerID = 1, Name = "Bob"],
[CustomerID = 2, Name = "Alice"],
[CustomerID = 3, Name = "Charlie"]
}),
Orders = Table.FromRecords({
[CustomerID = 1, Item = "Fishing rod"],
[CustomerID = 1, Item = "Worms"]
}),
Result = Table.Join(
Customers,
"CustomerID",
Orders,
"CustomerID",
JoinKind.LeftOuter
)
in
Result

ผลลัพธ์4 แถว: Bob (2 ออเดอร์), Alice (null), Charlie (null) – ลูกค้าทั้งหมดมีอยู่แม้ว่าจะไม่มีออเดอร์
Join หลายคอลัมน์ – จับคู่ TenantID และ CustomerIDlet Customers = Table.FromRecords({ [TenantID = 1, CustomerID = 1, Name = "Bob"], [TenantID = 2, CustomerID = 1, Name = "Alice"] }), Orders = Table.FromRecords(…

ใช้ list key {"TenantID", "CustomerID"} เพื่อจับคู่หลายคอลัมน์พร้อมกัน – ทั้งสองคอลัมน์ต้องตรงกันจึงจะจับคู่ได้

fx
= let
Customers = Table.FromRecords({
[TenantID = 1, CustomerID = 1, Name = "Bob"],
[TenantID = 2, CustomerID = 1, Name = "Alice"]
}),
Orders = Table.FromRecords({
[TenantID = 1, CustomerID = 1, OrderID = 101],
[TenantID = 2, CustomerID = 1, OrderID = 102]
}),
Result = Table.Join(
Customers,
{"TenantID", "CustomerID"},
Orders,
{"TenantID", "CustomerID"},
JoinKind.Inner
)
in
Result

ผลลัพธ์2 แถว: TenantID=1 (Bob กับ OrderID=101) และ TenantID=2 (Alice กับ OrderID=102) – จับคู่แบบถูกต้องตาม tenant
Anti Join – หาลูกค้าที่ไม่เคยสั่งซื้อTable.Join( Customers, "CustomerID", Orders, "CustomerID", JoinKind.LeftAnti )

Left Anti Join คืนแถวจากตารางซ้ายที่ไม่มีการจับคู่ในตารางขวา – มีประโยชน์สำหรับการหา records ที่ขาดหายไป

fx
= Table.Join(
Customers,
"CustomerID",
Orders,
"CustomerID",
JoinKind.LeftAnti
)

ผลลัพธ์แสดงเฉพาะลูกค้าที่ไม่มีแถวตรงกันใน Orders (เช่น Alice และ Charlie ที่ไม่มีออเดอร์)

FAQs

ต้องระบุ joinKind ไหม ถ้าไม่ระบุจะเกิดอะไรขึ้น?+

ไม่จำเป็น JoinKind.Inner จะถูกใช้เป็น default ถ้าคุณไม่ระบุ – แต่ถ้าต้อง Left Outer หรือประเภทอื่นต้องระบุชัดเจน

ถ้า key ไม่ตรงกันหรือค่า null จะเกิดอะไรขึ้น?+

Key ไม่ตรงกัน = ไม่มีการจับคู่ (หรือได้ null ใน Left/Right Outer Join) – ค่า null ใน key ถือว่าไม่ตรงกัน (null ≠ null)

ต่างกันอย่างไรระหว่าง Inner Join กับ Left Outer Join?+

Inner = เฉพาะแถวที่มีการจับคู่ | Left Outer = เก็บแถวทั้งหมดจากตารางซ้าย + เพิ่มข้อมูลจากตารางขวา (null ถ้าไม่มีการจับคู่)

สามารถ join มากกว่า 2 คอลัมน์พร้อมกันได้ไหม?+

ได้ ใช้ list key เช่น {"Col1", "Col2", "Col3"} และต้องตรงกันทั้ง 3 คอลัมน์จึงจะจับคู่

ถ้าตารางมีชื่อคอลัมน์ซ้ำกันจะเกิดอะไรขึ้น?+

Power Query จะเพิ่มเลขตัวเลขให้ (เช่น Name, Name2) – ถ้าไม่อยากให้เกิดปัญหาควร rename หรือ select เฉพาะคอลัมน์ที่ต้องการก่อน join

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.Join จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้Table.JoinTable functions
Table functions (7)
Table.AddJoinColumn

Table.AddJoinColumn เชื่อมต่อข้อมูลจากสองตารางตามคีย์ที่ตรงกัน โดยเก็บผลลัพธ์ในคอลัมน์ใหม่เป็นตารางแบบ nested แทนการขยายแนวนอน

Table.AddMatchColumn

Table.AddMatchColumn เพิ่มคอลัมน์ใหม่ที่มีค่าจากการแมตช์แถวในตารางอื่น โดยค้นหาค่าที่ตรงกับคีย์ เหมือน VLOOKUP แต่ทำงานโดยตรงบนตารางทั้งหมด

Table.Combine

Table.Combine ใช้สำหรับรวม list ของ table เข้าเป็น table เดียว ยับยั้ง append ตัว 1 แถวหลาย ๆ ตารางพร้อมกัน

Table.ExpandTableColumn

Table.ExpandTableColumn ใช้แตกข้อมูลจากคอลัมน์ที่เป็น nested table ออกมาเป็นคอลัมน์และแถวปกติในตารางหลัก โดยรักษาข้อมูลคอลัมน์อื่นไว้ และทำซ้ำแถวหลักสำหรับแต่ละแถวในตารางซ้อน มักใช้คู่กับ Table.NestedJoin หลัง join ตาราง หรือใช้ขยายข้อมูลจากแหล่งที่มีโครงสร้างแบบ hierarchical เช่น JSON หรือ API

Table.FuzzyJoin

Table.FuzzyJoin ใช้สำหรับเชื่อม 2 ตารางเข้าด้วยกันโดยใช้คีย์ที่มีความคล้ายคลึงกัน (Fuzzy Matching) แทนที่จะต้องเหมือนกันทุกตัวอักษร สามารถกำหนดระดับความเหมือน (Threshold) และตัวเลือกอื่นๆ ได้

Table.NestedJoin

Table.NestedJoin เชื่อมตารางสองตารางด้วยคีย์ที่กำหนด และสร้างคอลัมน์ใหม่ที่เก็บตารางย่อยของแถวที่จับคู่ได้ เหมาะกับงาน Merge ที่ต้องการเก็บรายละเอียดฝั่งขวาไว้เป็น nested table ก่อนจะ Expand หรือทำขั้นตอนต่อ

Table.SelectRows

Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword 'each' ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่

enumerations (2)
JoinAlgorithm.Type

ระบุอัลกอริทึมที่ใช้ในการ Join ข้อมูลจากสองตาราง ช่วยให้คุณควบคุมประสิทธิภาพการทำงานได้ดีขึ้น

JoinKind.Type

JoinKind.Type คือ enum ที่ระบุประเภทของการ Join (Inner, Outer, Anti, Semi) เมื่อรวมตารางข้อมูลสองตาราง ใช้กับ Table.Join เพื่อควบคุมว่าแถวไหนจะปรากฏในผลลัพธ์

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่