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

รวมคอลัมน์หลายคอลัมน์เป็นแถวเดียวใน MySQL ด้วย UNION ALL

UNPIVOT แบบง่าย: คอลัมน์หลายตัว → แถวเดียว (Rows)

ใช้ UNION ALL รวมผลลัพธ์ของ SELECT แต่ละคอลัมน์ เข้าด้วยกัน กลายเป็นคอลัมน์เดียวหลายแถว

สร้างตารางและข้อมูล (2 คอลัมน์, 2 แถว)

mysql> CREATE TABLE DemoTable (Value1 INT, Value2 INT);
Query OK, 0 rows affected (0.88 sec)

mysql> INSERT INTO DemoTable VALUES(100, 200), (500, 600);
Query OK, 2 rows affected

ข้อมูลต้นฉบับ (Wide Format)

+--------+--------+
| Value1 | Value2 |
+--------+--------+
|    100 |    200 |
|    500 |    600 |
+--------+--------+

คำสั่ง: UNION ALL รวม Value1 และ Value2

mysql> SELECT Value1 FROM DemoTable
    -> UNION ALL
    -> SELECT Value2 FROM DemoTable;

ผลลัพธ์ (Long Format: 4 แถว 1 คอลัมน์)

+--------+
| Value1 |
+--------+
|    100 |
|    500 |
|    200 |
|    600 |
+--------+

คำอธิบาย

  • SELECT Value1 FROM DemoTable → 100, 500
  • SELECT Value2 FROM DemoTable → 200, 600
  • UNION ALL → รวมต่อกัน (ไม่ DISTINCT, ไม่ Sort) → 100, 500, 200, 600

UNION vs UNION ALL

เพิ่ม Column ระบุแหล่งที่มา (Source Column)

SELECT 'Value1' AS source_col, Value1 AS val FROM DemoTable
UNION ALL
SELECT 'Value2', Value2 FROM DemoTable;

ผลลัพธ์

+------------+------+
| source_col | val  |
+------------+------+
| Value1     |  100 |
| Value1     |  500 |
| Value2     |  200 |
| Value2     |  600 |
+------------+------+

MySQL 8.0: ใช้ LATERAL JOIN / JSON_TABLE (Advanced Unpivot)

SELECT t.Id, jt.col_name, jt.col_value
FROM DemoTable t,
LATERAL (
    SELECT 'Value1' AS col_name, t.Value1 AS col_value
    UNION ALL SELECT 'Value2', t.Value2
) jt;

⚠️ ข้อควรระวัง

  • ทุก SELECT ใน UNION ต้องมีจำนวนคอลัมน์ และ Data Type เท่ากัน
  • Column Name ของผลลัพธ์มาจาก SELECT ตัวแรก
  • ORDER BY ใช้ได้เฉพาะท้ายสุด (ต้อง wrap ใน Subquery/Derived Table)
OperatorDuplicateSortPerformance
UNIONลบซ้ำ (DISTINCT)มี Implicit Sortช้ากว่า
UNION ALLเก็บทุกแถวไม่ Sortเร็วกว่า (แนะนำ)