Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join
=Table.Join(table1 as table, key1 as any, table2 as table, key2 as any, optional joinKind as nullable number, optional joinAlgorithm as nullable number, optional keyEqualityComparers as nullable list) as table
=Table.Join(table1 as table, key1 as any, table2 as table, key2 as any, optional joinKind as nullable number, optional joinAlgorithm as nullable number, optional keyEqualityComparers as nullable list) as table
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table1 | table | Yes | ตารางแรก (ตารางซ้าย) – ตัวอักษรกำหนดว่าจะรักษาแถวจากตารางนี้ไว้ในจำนวนเท่าใด | |
| key1 | any | Yes | คอลัมน์ key จากตารางแรก – สามารถระบุเป็น text เดี่ยว “ID” หรือ list หลายคอลัมน์ {“TenantID”, “CustomerID”} | |
| table2 | table | Yes | ตารางที่สอง (ตารางขวา) – ตารางที่ต้องการรวมข้อมูลเข้า | |
| key2 | any | Yes | คอลัมน์ key จากตารางที่สอง – ต้องตรงกันกับ key1 เพื่อจับคู่ข้อมูล | |
| joinKind | number | Optional | ประเภท join (JoinKind.Inner, JoinKind.LeftOuter, JoinKind.RightOuter, JoinKind.FullOuter, JoinKind.LeftAnti, JoinKind.RightAnti, JoinKind.LeftSemi, JoinKind.RightSemi) – ถ้าไม่ระบุจะเป็น JoinKind.Inner | |
| joinAlgorithm | number | Optional | อัลกอริทึมที่ใช้ในการ join (ใช้ต่อเมื่อต้องการปรับแต่ง performance – ใช้ไม่บ่อยนัก) | |
| keyEqualityComparers | list | Optional | รายการ equality comparer สำหรับการเปรียบเทียบค่า (ใช้ต่อเมื่อต้องการ case-insensitive หรือการเปรียบเทียบพิเศษ) |
Table.Join( Customers, "CustomerID", Orders, "CustomerID", JoinKind.Inner )= Table.Join(
Customers,
"CustomerID",
Orders,
"CustomerID",
JoinKind.Inner
)
ตารางที่รวมข้อมูลลูกค้า (Name, Phone) กับออเดอร์ (OrderID, Item, Price) - เฉพาะลูกค้าที่มีออเดอร์เท่านั้น
let Customers = Table.FromRecords({ [CustomerID = 1, Name = "Bob"], [CustomerID = 2, Name = "Alice"], [CustomerID = 3, Name = "Charlie"] }), Orders = Table.From…= 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) - ลูกค้าทั้งหมดมีอยู่แม้ว่าจะไม่มีออเดอร์
let Customers = Table.FromRecords({ [TenantID = 1, CustomerID = 1, Name = "Bob"], [TenantID = 2, CustomerID = 1, Name = "Alice"] }), Orders = Table.FromRecords(…= 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
Table.Join( Customers, "CustomerID", Orders, "CustomerID", JoinKind.LeftAnti )= Table.Join(
Customers,
"CustomerID",
Orders,
"CustomerID",
JoinKind.LeftAnti
)
แสดงเฉพาะลูกค้าที่ไม่มีแถวตรงกันใน Orders (เช่น Alice และ Charlie ที่ไม่มีออเดอร์)
ไม่จำเป็น JoinKind.Inner จะถูกใช้เป็น default ถ้าคุณไม่ระบุ – แต่ถ้าต้อง Left Outer หรือประเภทอื่นต้องระบุชัดเจน
Key ไม่ตรงกัน = ไม่มีการจับคู่ (หรือได้ null ใน Left/Right Outer Join) – ค่า null ใน key ถือว่าไม่ตรงกัน (null ≠ null)
Inner = เฉพาะแถวที่มีการจับคู่ | Left Outer = เก็บแถวทั้งหมดจากตารางซ้าย + เพิ่มข้อมูลจากตารางขวา (null ถ้าไม่มีการจับคู่)
ได้ ใช้ list key เช่น {“Col1”, “Col2”, “Col3”} และต้องตรงกันทั้ง 3 คอลัมน์จึงจะจับคู่
Power Query จะเพิ่มเลขตัวเลขให้ (เช่น Name, Name2) – ถ้าไม่อยากให้เกิดปัญหาควร rename หรือ select เฉพาะคอลัมน์ที่ต้องการก่อน join
Table.Join ทำหน้าที่รวมตารางสองตารางเข้าด้วยกัน โดยจับคู่แถวตามค่าที่ตรงกันในคอลัมน์ key
ส่วนตัวผมใช้ Table.Join เวลาต้องรวมข้อมูลจากตารางที่มีความสัมพันธ์กัน เช่นรวมออเดอร์กับข้อมูลลูกค้า แล้วระบุว่า join แบบไหน (inner, left outer ฯลฯ) ตรงไปตรงมา ไม่ต้องยุ่งกับ conditional logic แบบ Table.SelectRows 😎