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

谢谢

4

2 回答 2

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;
/
于 2013-05-07T08:53:34.213 回答
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 而不是 Oracle)

将我的 SQL 与 DARK_As proc 示例结合起来有点儿戏:-

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;
/

请注意,这未经测试(如果 Attributes 表包含多个表的描述,您可能需要表的 GROUP BY 子句)。

于 2013-05-07T08:57:18.197 回答