MYSQL过程:循环遍历文本列的不同值并创建临时表

MYSQL过程:循环遍历文本列的不同值并创建临时表,mysql,stored-procedures,Mysql,Stored Procedures,我的subgroups表 subgroup_abbr_str AA BB BB CC DD DD DD ... and many more 我想为每个值创建一个临时表。临时表AA、BB、CC和DD。这是我创建表var而不是AA的初始代码 CREATE PROCEDURE FLAGITERATION() BEGIN DECLARE totRows INT DEFAULT 0; DECLARE startRow INT DEFAULT 0; DECLARE var TEXT DEFAULT NU

我的subgroups表

subgroup_abbr_str
AA
BB
BB
CC
DD
DD
DD
... and many more
我想为每个值创建一个临时表。临时表AA、BB、CC和DD。这是我创建表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;
;;
CREATE PROCEDURE flag迭代()
开始
声明默认值为0;
声明startRow INT默认值为0;
声明var文本默认为NULL;
从子组中选择COUNT(*)到totRows;
设置startRow=0;

而startRow则需要花费更多的时间用所有表重建样本数据,以纠正编程错误

您想要做的事情可以通过动态sql来完成

此外,还应该为循环使用光标

|总数(目前)| | -----------: | | 1 |
dbfiddle

您使用以下语句的目的是什么?设置@a:=\u子组;这只是一个调试行,我用它来检查程序流。
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 |