Temporary Table 暫存表 (SQL Temporary Table)

Temporary Table(暫存表、臨時表)是一種暫時性的資料表,只存在於當前的連線階段中。當連線結束時,暫存表會自動被刪除。

暫存表適合用來儲存中間計算結果、複雜查詢的暫存資料,或是需要多次使用的子查詢結果。

建立暫存表

SQL Server / PostgreSQL

CREATE TEMPORARY TABLE temp_customers (
    id INT,
    name VARCHAR(50),
    city VARCHAR(50)
);

-- 或使用縮寫
CREATE TEMP TABLE temp_customers (
    id INT,
    name VARCHAR(50)
);

MySQL

CREATE TEMPORARY TABLE temp_customers (
    id INT,
    name VARCHAR(50),
    city VARCHAR(50)
);

Oracle

Oracle 使用 Global Temporary Table,表結構是永久的,但資料是暫時的:

CREATE GLOBAL TEMPORARY TABLE temp_customers (
    id NUMBER,
    name VARCHAR2(50)
) ON COMMIT DELETE ROWS;  -- 交易結束時刪除資料

-- 或
ON COMMIT PRESERVE ROWS;  -- 連線結束時才刪除資料

從查詢結果建立暫存表

SQL Server

SELECT * INTO #temp_customers
FROM customers
WHERE city = '台北';
SQL Server 使用 # 前綴表示暫存表,## 表示全域暫存表(所有連線都能存取)。

MySQL

CREATE TEMPORARY TABLE temp_customers AS
SELECT * FROM customers WHERE city = '台北';

PostgreSQL

CREATE TEMP TABLE temp_customers AS
SELECT * FROM customers WHERE city = '台北';

使用暫存表

暫存表建立後,可以像一般資料表一樣使用:

-- 新增資料
INSERT INTO temp_customers (id, name, city) VALUES (1, '張一', '台北');

-- 查詢資料
SELECT * FROM temp_customers;

-- 更新資料
UPDATE temp_customers SET city = '新北' WHERE id = 1;

-- 刪除資料
DELETE FROM temp_customers WHERE id = 1;

刪除暫存表

雖然暫存表會在連線結束時自動刪除,但如果想要提早釋放資源,可以手動刪除:

DROP TEMPORARY TABLE temp_customers;

-- SQL Server
DROP TABLE #temp_customers;

暫存表 vs CTE vs 子查詢

特性暫存表CTE子查詢
可重複使用同一查詢內
可建立索引
生命週期連線期間單次查詢單次查詢
適用情境大量資料、多次使用提高可讀性簡單情境

實際應用範例

將複雜計算結果存入暫存表,供後續多次使用:

-- 建立暫存表儲存每個客戶的訂單統計
CREATE TEMPORARY TABLE temp_customer_stats AS
SELECT 
    customer_id,
    COUNT(*) AS order_count,
    SUM(amount) AS total_amount
FROM orders
GROUP BY customer_id;

-- 查詢高價值客戶
SELECT * FROM temp_customer_stats WHERE total_amount > 10000;

-- 查詢訂單次數最多的客戶
SELECT * FROM temp_customer_stats ORDER BY order_count DESC LIMIT 10;