เนื่องจากข้อเสนอแนะของลูปแสดงถึงการร้องขอโซลูชันประเภทโพรซีเดอร์ ที่นี่เป็นของฉัน
แบบสอบถามใด ๆ ที่ทำงานกับระเบียนเดียวที่นำมาจากตารางสามารถถูกรวมไว้ในขั้นตอนเพื่อให้รันผ่านแต่ละแถวของตารางได้ดังนี้:
DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;
นี่คือขั้นตอนตามตัวอย่างของคุณ (table_A และ table_B ใช้เพื่อความชัดเจน)
CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO
INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
SET i = i + 1;
END WHILE;
End;
;;
จากนั้นอย่าลืมรีเซ็ตตัวคั่น
DELIMITER ;
และรันโพรซีเดอร์ใหม่
CALL ROWPERROW();
คุณสามารถทำอะไรก็ได้ตามต้องการในบรรทัด "INSERT INTO" ซึ่งฉันคัดลอกมาจากคำขอตัวอย่างของคุณ
โปรดสังเกตอย่างระมัดระวังว่าบรรทัด "INSERT INTO" ที่ใช้ในที่นี้จะสะท้อนบรรทัดในคำถาม ตามความคิดเห็นของคำตอบนี้คุณต้องตรวจสอบให้แน่ใจว่าแบบสอบถามของคุณถูกต้องตามหลักไวยากรณ์สำหรับเวอร์ชันของ SQL ที่คุณใช้อยู่
ในกรณีง่ายๆที่ช่อง ID ของคุณเพิ่มขึ้นและเริ่มต้นที่ 1 บรรทัดในตัวอย่างอาจกลายเป็น:
INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;
แทนที่บรรทัด "SELECT COUNT" ด้วย
SET n=10;
จะช่วยให้คุณทดสอบแบบสอบถามของคุณใน 10 ระเบียนแรกใน table_A เท่านั้น
สิ่งสุดท้าย. กระบวนการนี้ยังง่ายมากในการซ้อนกันในตารางต่างๆและเป็นวิธีเดียวที่ฉันสามารถดำเนินการตามขั้นตอนบนตารางเดียวซึ่งแทรกระเบียนจำนวนต่างๆลงในตารางใหม่จากแต่ละแถวของตารางหลักแบบไดนามิก
หากคุณต้องการให้ทำงานได้เร็วขึ้นอย่าลืมลองตั้งค่าตามหากไม่เป็นเช่นนั้นก็ใช้ได้ คุณยังสามารถเขียนข้างต้นในรูปแบบเคอร์เซอร์ได้ แต่อาจไม่ช่วยเพิ่มประสิทธิภาพ เช่น:
DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;
CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
DECLARE cursor_ID INT;
DECLARE cursor_VAL VARCHAR;
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO cursor_ID, cursor_VAL;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
END LOOP;
CLOSE cursor_i;
END;
;;
อย่าลืมประกาศตัวแปรที่คุณจะใช้เป็นประเภทเดียวกับตัวแปรจากตารางที่สอบถาม
คำแนะนำของฉันคือให้ใช้แบบสอบถาม setbased เมื่อคุณทำได้และใช้เฉพาะลูปหรือเคอร์เซอร์ธรรมดาเท่านั้นหากคุณต้องการ