首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 多表聯合查詢實戰:游標合併兩張表結果集的儲存過程範例

     編輯:MySQL 綜合教學

場景描述

需從 orders 取前 2 筆客戶 ID、從 region 取前 2 筆區域描述,交錯合併至臨時表輸出。類似報表需「橫向拼接」兩張無關聯表的部分資料。

儲存過程實作 (T-SQL 風格,MySQL 需調整)

DELIMITER $$
CREATE PROCEDURE `MergeTwoTablesDemo`()
BEGIN
    DECLARE v_col1 VARCHAR(20);
    DECLARE v_col2 VARCHAR(20);
    DECLARE done INT DEFAULT 0;
    DECLARE cur1 CURSOR FOR SELECT customer_id FROM orders LIMIT 2;
    DECLARE cur2 CURSOR FOR SELECT region_description FROM region LIMIT 2;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    -- 建立臨時表
    DROP TEMPORARY TABLE IF EXISTS tmp_merged;
    CREATE TEMPORARY TABLE tmp_merged (
        id INT AUTO_INCREMENT PRIMARY KEY,
        col1 VARCHAR(20),
        col2 VARCHAR(20)
    ) ENGINE=Memory;

    OPEN cur1;
    OPEN cur2;

    fetch_loop: LOOP
        FETCH cur1 INTO v_col1;
        FETCH cur2 INTO v_col2;
        IF done THEN
            LEAVE fetch_loop;
        END IF;
        INSERT INTO tmp_merged (col1, col2) VALUES (v_col1, v_col2);
    END LOOP;

    CLOSE cur1;
    CLOSE cur2;

    SELECT * FROM tmp_merged;
    DROP TEMPORARY TABLE tmp_merged;
END$$
DELIMITER ;

關鍵點解析

  • 雙游標同步 FETCH:單次迴圈同時推進兩個游標,行數以較少者為準。
  • NOT FOUND HANDLER:任一游標耗盡即設 done=1,避免無限迴圈。
  • Memory 引擎臨時表:純記憶體操作,極速,會話結束自動清理。
  • LIMIT 子句:直接在游標 SQL 限制筆數,避免全表掃描。

純 SQL 替代方案 (更高效、推薦)

若兩表有關聯鍵或可生成行號,優先用 JOIN 或 UNION ALL + 窗口函數:

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved