很像这些问题:
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 |
从其他表中的数据开始(可能随时间变化,因此如果添加新字段,我需要创建新表) 这样的事情甚至可能吗?我觉得这可能违背了很多好的做法,但它无法帮助......
答案 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块。
您可以使用类似的策略填充数据表。正如其他人所指出的那样,你必须在分析时知道这些列,为了解决这个限制,你可以遵循这里所做的策略: