Oracle临时表列和来自另一个表的行

时间:2015-09-24 14:19:54

标签: oracle oracle11g

很像这些问题:
MSSQL Create Temporary Table whose columns names are obtained from row values of another table

Create a table with column names derived from row values of another table

我需要对Oracle做同样的事情,但我还需要用另一个以特定方式组织的表中的数据来填充这个新表。一个例子:

表用户

|id|name |
----------
|1 |admin|
|2 |user |

表user_data_cols

|id|field_name|field_description|
---------------------------------
|1 |age       |Your age         |
|2 |children  |Your children    |

表user_data_rows

|id|user_id|col_id|field_value|
-------------------------------
|1 |1      |1     |32         |
|2 |1      |2     |1          |
|3 |2      |1     |19         |
|4 |2      |2     |0          |

我想要的是仅使用sql创建这样的表:

|user_id|age|children|
----------------------
|1      |32 |1       |
|2      |19 |0       |

从其他表中的数据开始(可能随时间变化,因此如果添加新字段,我需要创建新表) 这样的事情甚至可能吗?我觉得这可能违背了很多好的做法,但它无法帮助......

1 个答案:

答案 0 :(得分:2)

为了进行比较,这里是您链接的答案:

Create a table with column names derived from row values of another table

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;

现在让我们在Oracle 11g中做同样的事情:

DECLARE
  stmt varchar2(8000);
BEGIN
  SELECT 'CREATE TABLE Table_2 ('||
  (SELECT 
      LISTAGG(nameCol, ', ') WITHIN GROUP (ORDER BY nameCol) "cols"
  FROM 
  (SELECT DISTINCT nameCol||' VARCHAR2(50)' nameCol FROM table_1) table_x)||
  ')'
INTO stmt
FROM DUAL;
EXECUTE IMMEDIATE stmt;
END;
/

您问过是否可以使用'仅使用sql',我的回答使用了PL / SQL块。

您可以使用类似的策略填充数据表。正如其他人所指出的那样,你必须在分析时知道这些列,为了解决这个限制,你可以遵循这里所做的策略:

Dynamic Pivot