2013-04-04 83 views
7

假设我有以下表一列:创建另一个表中的行值派生列名的表

TABLE_1

----------- 
| nameCol | 
----------- 
| A  | 
| A  | 
| B  | 
| C  | 
----------- 

我想创建一个新的表具有以下列名称:

TABLE_2

| pk | A | B | C | 

也就是说,从一个t时的数据能成为第二张表的列名。 在某个层面可能有一个关键点,但我无法真正得到答案。

我想:

create table Table_2 (
    select group_concat(distinct(nameCol), " varchar(50), ") 
    from Table_1 
); 

回答

3

你可以使用一个动态查询:

SELECT 
    CONCAT(
    'CREATE TABLE Table_2 (', 
    GROUP_CONCAT(DISTINCT 
     CONCAT(nameCol, ' VARCHAR(50)') 
     SEPARATOR ','), 
    ');') 
FROM 
    Table_1 
INTO @sql; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

请参阅小提琴here

+1

非常感谢您的回复。我试过上面的查询。但是,我的@sql变量中的查询字符串非常长(因为列数很多)。这在“PREPARE stmt”行​​中造成问题。它似乎将一个点以外的查询字符串的大部分删除,而不完整的字符串会导致语法错误。 – 2013-04-04 20:56:01

+1

@AlptiginJalayr我认为问题出在GROUP_CONCAT函数上,它的最大长度是有限的,但是你可以使用例如'SET SESSION group_concat_max_len = 1000000;' – fthiella 2013-04-04 21:05:58

+0

来增加这个限制。但是,这不是错误的group_concat,而是PREPARE语句从[sql]查询开始。我知道这是因为我在PREPARE之前执行了SELECT [at] sql,并且它返回了完整的查询。 – 2013-04-05 14:24:29

相关问题