假设我目前有两个表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先谢谢各位大虾。

解决方案 »

  1.   

    http://topic.csdn.net/u/20100914/10/018015f8-40a1-46ef-932a-4ebf2db83f2c.html?seed=2054816992&r=68374788#r_68374788看下这个帖子,
    你的问题更简单,稍微改改就实现了。
      

  2.   

    很遗憾,目前的几种数据库产品,SQL SERVER,ORALCE等都没有这种语句。只能通过存储过程或者程序代码来实现。
    从合理性角度来看,这个功能应该在你的程序中实现而不是数据库端用存储过程实现。
      

  3.   

    难点在于怎么样拼出你的CREATE TABLE命令。
    你这个问题用2个游标内嵌,就能搞定。
      

  4.   

    二楼,那个贴就是我发的。
    我也试着用了两个游标,不过没有成功。
    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;
      

  5.   

    select * from test1,test2 可以生成6条记录,打开此游标,循环建表
      

  6.   

    set b=concat('create table ',conact(a,'_',d),'(`host` varchar(16) NOT NULL )'); 这样拼出表名称。6楼用一个游标就搞定了。赞同用6楼的一个游标的办法。
      

  7.   

    WWWWA好
    游标用的不好。
    能否给个实例语句。
      

  8.   


    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();
      

  9.   

    DELIMITER $$USE `ee`$$DROP PROCEDURE IF EXISTS `test`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
    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 ;