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