Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ใช้ MySQL JOIN โดยไม่มี ON Condition ด้วย CROSS JOIN

CROSS JOIN** (Cartesian Product) คือการ Join โดยไม่มีเงื่อนไข ON ทุกแถวของตารางแรกจะจับคู่กับทุกแถวของตารางที่สอง

สูตร: จำนวนแถวผลลัพธ์ = Rows(Table A) × Rows(Table B)

ตัวอย่าง: สร้างตารางและข้อมูล

ตาราง ForeignTableDemo (2 แถว)

CREATE TABLE ForeignTableDemo (
    Id INT,
    Name VARCHAR(100),
    FK INT
);

INSERT INTO ForeignTableDemo VALUES (1, 'John', 1), (2, 'Bob', 2);

ตาราง PrimaryTableDemo (3 แถว)

CREATE TABLE PrimaryTableDemo (
    FK INT PRIMARY KEY,
    Address VARCHAR(100)
);

INSERT INTO PrimaryTableDemo VALUES (1, 'US'), (2, 'UK'), (3, 'Unknown');

CROSS JOIN Query

SELECT 
    ForeignTableDemo.Id, 
    ForeignTableDemo.Name, 
    PrimaryTableDemo.Address
FROM ForeignTableDemo
CROSS JOIN PrimaryTableDemo;

ผลลัพธ์: 2 × 3 = 6 แถว

+------+------+---------+
| Id   | Name | Address |
+------+------+---------+
| 1    | John | US      |
| 2    | Bob  | US      |
| 1    | John | UK      |
| 2    | Bob  | UK      |
| 1    | John | Unknown |
| 2    | Bob  | Unknown |
+------+------+---------+

เมื่อไหร่ควรใช้ CROSS JOIN

  • สร้าง Test Data / Combinations (เช่น ทุก Product × ทุก Store)
  • Matrix / Grid Generation
  • การคำนวณทางสถิติที่ต้องการทุกคู่
  • ไม่ควรใช้ กับตารางใหญ่ (Performance Disaster)

INNER JOIN (มี ON Condition) - เปรียบเทียบ

SELECT 
    ForeignTableDemo.Id, 
    ForeignTableDemo.Name, 
    PrimaryTableDemo.Address
FROM ForeignTableDemo
INNER JOIN PrimaryTableDemo 
    ON ForeignTableDemo.FK = PrimaryTableDemo.FK;

ผลลัพธ์: 2 แถว (เฉพาะที่ Match)

+------+------+---------+
| Id   | Name | Address |
+------+------+---------+
| 1    | John | US      |
| 2    | Bob  | UK      |
+------+------+---------+

Syntax อื่นๆ

  • CROSS JOIN table2 - Explicit
  • table1, table2 - Implicit (Comma Join) ⚠️ ไม่แนะนำ (Legacy)
  • INNER JOIN table2 ON condition - Standard Join

⚠️ คำเตือน

CROSS JOIN กับตาราง 10,000 แถว × 10,000 แถว = 100 ล้านแถว → Out of Memory / Timeout เสมอ ต้องมี WHERE/LIMIT หรือใช้เฉพาะตารางเล็ก