2013-05-07 110 views
0

首先请不要将其标记为重复项,因为我不是要求选择,而是创建新表。为了更清楚,我有这样一个表:创建其列属性为另一行的表的表格

CREATE TABLE Attributes (
    Col_Name VARCHAR(45) NULL, 
    Col_type VARCHAR(45) NULL, 
    Col_ID VARCHAR(45) NULL 
); 

Col_Name | Col_type| Col_ID 
----------------------------------------------- 
C1   T1  1 
C2   T2  2 

,我想结束有这样的事情:这些

C1(T1)| C2(T2) 
---------------- 
Val  Val 

谢谢

+0

我寻觅了一点,但一切都是执行一些特殊的“选择”有关,但我需要有一个新的表在这里,如果你能告诉我什么是实现这一目标的可能性,因为我明白,这可能不是直截了当。谢谢 – 2013-05-07 07:46:34

+1

'SELECT Col_Name,Col_Type,Col_ID FROM Attributes'然后用你的编程语言处理它,并把它放到一个HashTable中,例如。 – Adder 2013-05-07 07:58:46

+0

你能给我一个java的小例子吗?无论如何,非常感谢你:) – 2013-05-07 08:01:39

回答

1

这些程序是在Oracle中,一应该适合你的问题。这将创建具有与行数一样多的列的表格。

属性的属性和固定列类型:

DECLARE 
    lc_string VARCHAR2(2000); 
BEGIN 
    FOR c1 IN (SELECT Col_Name, Col_type FROM Attributes ORDER BY Col_ID) LOOP 
    lc_string := lc_string||c1.Col_Name||'_'||c1.Col_type||'_'||' VARCHAR2(100), '; 
    END LOOP; 
    lc_string := SUBSTR(lc_string,0,(LENGTH(lc_string)-2)); 
    lc_string := 'CREATE TABLE some_name ('||lc_string||')'; 
    EXECUTE IMMEDIATE lc_string; 
END; 
/

属性为列类型:

DECLARE 
    lc_string VARCHAR2(2000); 
BEGIN 
    FOR c1 IN (SELECT Col_Name, Col_type FROM Attributes ORDER BY Col_ID) LOOP 
    lc_string := lc_string||c1.Col_Name||' '||c1.Col_type||', '; 
    END LOOP; 
    lc_string := SUBSTR(lc_string,0,(LENGTH(lc_string)-2)); 
    lc_string := 'CREATE TABLE some_name ('||lc_string||')'; 
    EXECUTE IMMEDIATE lc_string; 
END; 
/
+0

非常感谢你的回答,但甲骨文不断告诉我,“即时”未知命令.. – 2013-05-07 09:30:37

+0

尽量把屏幕上的lc_string,看看它是否是正确的格式(全部',()'已经到位)。 EXECUTE IMMEDIATE是Oracle中的标准PL/SQL语句。 – 2013-05-07 09:44:00

+0

我也使用Oracle 11g,并且每个方面都正常工作。 – 2013-05-07 09:58:36

1

除非这是因为它是关于你将要创建的表往往足以让一个临时表这是值得的。

不管怎么说,以下基本SQL将创建创建查询为您提供: -

SELECT CONCAT('CREATE TABLE IF NOT EXISTS `sometable` (, ', GROUP_CONCAT(CONCAT('`', Col_Name, '` ', Col_type) ORDER BY Col_ID SEPARATOR ','), ");") 
FROM Attributes 

(假设MySQL的,而不是甲骨文)

的打法结合我与DARK_As PROC例子SQL一下: -

DECLARE 
BEGIN 
    FOR c1 IN (SELECT 'CREATE TABLE IF NOT EXISTS `sometable` (, ' || (LISTAGG('`' || Col_Name || '` ' || Col_type, ',') WITHIN GROUP ORDER BY Col_ID) || ');') AS CreateCommand FROM Attributes) LOOP 
    EXECUTE IMMEDIATE c1.CreateCommand; 
    END LOOP; 
END; 
/

请注意,这不是测试(你可能需要一个GROUP BY子句中的表,应在属性表中包含多个的说明表)。

+0

我认为你在'''之前的最后一列中会得到一个',',这可能会引起错误。 – 2013-05-07 09:04:18

+0

你不应该这样做,因为逗号是由group_concat添加的,所以只能用于分隔字段..除非我在某处输入了错别字 – Kickstart 2013-05-07 09:16:38

+0

是的,你是对的。没有注意到。 – 2013-05-07 09:27:19