假设我目前有两个表test1和test2。
test1有字段name:
数据比如:
name1
name2test2有字段id:
数据比如:
id1
id2
id3
请教一个sql语句能够创建2*3 = 6个表。
表名分别为
name1_id1
name2_id1
name1_id2
name2_id2
name1_id3
name2_id3先谢谢各位大虾。
test1有字段name:
数据比如:
name1
name2test2有字段id:
数据比如:
id1
id2
id3
请教一个sql语句能够创建2*3 = 6个表。
表名分别为
name1_id1
name2_id1
name1_id2
name2_id2
name1_id3
name2_id3先谢谢各位大虾。
解决方案 »
- mysql字符集问题
- 一个SQL语句
- Postgresql能行列转换吗?
- Lock wait timeout exceeded; try restarting transaction
- mysql replication
- 有关日文乱码问题:Mysql中数据是日文、取下来就变成???了
- 急,在线等==mysqldump时如果密码带有*,怎么处理?
- MySql菜鸟提问:怎么把MSSQL下的数据导入到MySQL及MySql下如何建立表
- 求教为什么我用myException查看数据库会出现乱码
- 求助,mysql中如何在一个存储过程里定义一个新的存储过程?
- 递归sql问题
- mysql 如何实现2个数据库 之间的交互?
你的问题更简单,稍微改改就实现了。
从合理性角度来看,这个功能应该在你的程序中实现而不是数据库端用存储过程实现。
你这个问题用2个游标内嵌,就能搞定。
我也试着用了两个游标,不过没有成功。
CREATE PROCEDURE `Create_Table`(
)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE done2 INT DEFAULT 0;
DECLARE a varchar(200) ;
DECLARE d varchar(200) ;
DECLARE b varchar(1024) ; DECLARE mycurl CURSOR FOR select name as pl_name from test1;
DECLARE mycurl2 CURSOR FOR select id as pl_id from test2;DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 and done2 = 1; OPEN mycurl;
REPEAT
FETCH mycurl INTO a;
IF NOT done THEN
OPEN mycurl2;
REPEAT
FETCH mycurl2 INTO d;
IF NOT done2 THEN
set b=concat('create table ',a,d,'(`host` varchar(16) NOT NULL )'); END IF;
UNTIL done2 END REPEAT;
CLOSE mycurl2;
END IF;
UNTIL done END REPEAT;
CLOSE mycurl;
END;
游标用的不好。
能否给个实例语句。
create table test1(name varchar(30));
create table test2(id varchar(30));
insert into test1 values('test1'),('test2');
insert into test2 values('id1'),('id2'),('id3');drop procedure if exists Create_Table;
CREATE PROCEDURE Create_Table(
)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE name varchar(200) ;
DECLARE id varchar(200) ;
DECLARE b varchar(200) ;
DECLARE cur1 CURSOR FOR
select * from test1,test2;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO name,id;
IF NOT done THEN
set b=concat('create table ',concat(name,'_',id),'(colname1 int)');
SET @E=b;
PREPARE stmt1 FROM @E;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END;call Create_Table();
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE n1 VARCHAR(10);
DECLARE n2 VARCHAR(10);
DECLARE cur1 CURSOR FOR SELECT * FROM test1,test2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
FETCH cur1 INTO n1,n2;
WHILE done=0 DO
SET @sqlstmt=CONCAT('create table ',n1,'_',n2,'(id int)');
SELECT @sqlstmt;
PREPARE stmt1 FROM @sqlstmt;
EXECUTE stmt1 ;
DEALLOCATE PREPARE stmt1;
FETCH cur1 INTO n1,n2;
END WHILE;
END$$DELIMITER ;