MYSQL 过程:遍历文本列的不同值并创建临时表
MYSQL Procedure : Loop over distinct values of Text column and create temporary tables
我的子组 table 有
subgroup_abbr_str
AA
BB
BB
CC
DD
DD
DD
... and many more
我想为每个值创建一个临时 table。临时 Table AA、BB、CC 和 DD。这是我创建 table var 而不是 AA 的初始代码。
CREATE PROCEDURE FLAGITERATION()
BEGIN
DECLARE totRows INT DEFAULT 0;
DECLARE startRow INT DEFAULT 0;
DECLARE var TEXT DEFAULT NULL;
SELECT COUNT(*) FROM subgroups INTO totRows ;
SET startRow=0;
WHILE startRow<totRows DO
SELECT DISTINCT subgroup_abbr_str FROM subgroups LIMIT startRow,1 INTO var ;
CREATE TEMPORARY TABLE var AS SELECT SUM(present)
FROM trad_new;
SET startRow = startRow + 1;
END WHILE;
End;
;;
为了更正编程错误table,重建示例数据需要更多时间
你想做的可以用动态 sql 来完成。
你还应该在循环中使用游标
CREATE TABLE subgroups (subgroup_abbr_str VaRCHAR(2));
INSERT INTO subgroups VALUES ('AA'),
('BB'),
('BB'),
('CC'),
('DD'),
('DD'),
('DD')
CREATE tABLE trad_new (present INT)
INSERT INTO trad_new VALUEs (1)
CREATE PROCEDURE FLAGITERATION()
BEGIN
DECLARE finished INTEGER DEFAULT 0;
DECLARE _subgroup varchar(100) DEFAULT "";
-- declare cursor for subgroup_abbr_str
DEClARE cursubgroup
CURSOR FOR
SELECT DISTINCT subgroup_abbr_str FROM subgroups;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
OPEN cursubgroup;
getsubgroup: LOOP
FETCH cursubgroup INTO _subgroup;
IF finished = 1 THEN
LEAVE getsubgroup;
-- build taböe
SET @sql = CONCAT("CREATE TEMPORARY TABLE ",_subgroup," AS SELECT SUM(present)
FROM trad_new;");
PREPARE stmt FROM @sql;
EXECUTE stmt;
END LOOP getsubgroup;
CLOSE cursubgroup;
DEALLOCATE PREPARE stmt;
End
call FLAGITERATION()
SELECT * FROM AA;
| SUM(present) |
| -----------: |
| 1 |
db<>fiddle here
我的子组 table 有
subgroup_abbr_str
AA
BB
BB
CC
DD
DD
DD
... and many more
我想为每个值创建一个临时 table。临时 Table AA、BB、CC 和 DD。这是我创建 table var 而不是 AA 的初始代码。
CREATE PROCEDURE FLAGITERATION()
BEGIN
DECLARE totRows INT DEFAULT 0;
DECLARE startRow INT DEFAULT 0;
DECLARE var TEXT DEFAULT NULL;
SELECT COUNT(*) FROM subgroups INTO totRows ;
SET startRow=0;
WHILE startRow<totRows DO
SELECT DISTINCT subgroup_abbr_str FROM subgroups LIMIT startRow,1 INTO var ;
CREATE TEMPORARY TABLE var AS SELECT SUM(present)
FROM trad_new;
SET startRow = startRow + 1;
END WHILE;
End;
;;
为了更正编程错误table,重建示例数据需要更多时间
你想做的可以用动态 sql 来完成。
你还应该在循环中使用游标
CREATE TABLE subgroups (subgroup_abbr_str VaRCHAR(2)); INSERT INTO subgroups VALUES ('AA'), ('BB'), ('BB'), ('CC'), ('DD'), ('DD'), ('DD')
CREATE tABLE trad_new (present INT)
INSERT INTO trad_new VALUEs (1)
CREATE PROCEDURE FLAGITERATION() BEGIN DECLARE finished INTEGER DEFAULT 0; DECLARE _subgroup varchar(100) DEFAULT ""; -- declare cursor for subgroup_abbr_str DEClARE cursubgroup CURSOR FOR SELECT DISTINCT subgroup_abbr_str FROM subgroups; -- declare NOT FOUND handler DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; OPEN cursubgroup; getsubgroup: LOOP FETCH cursubgroup INTO _subgroup; IF finished = 1 THEN LEAVE getsubgroup; -- build taböe SET @sql = CONCAT("CREATE TEMPORARY TABLE ",_subgroup," AS SELECT SUM(present) FROM trad_new;"); PREPARE stmt FROM @sql; EXECUTE stmt; END LOOP getsubgroup; CLOSE cursubgroup; DEALLOCATE PREPARE stmt; End
call FLAGITERATION()
SELECT * FROM AA;
| SUM(present) | | -----------: | | 1 |
db<>fiddle here