2015-09-24 2 views
0

Многое, как эти вопросы:
MSSQL Create Temporary Table whose columns names are obtained from row values of another tableOracle Временные столбцы таблицы и данные из строк другой таблицы

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

Какова логика, чтобы получить результирующие данные? У вас есть обычный запрос только для получения данных? И что вы подразумеваете под * «создать временную таблицу» *? Вы имеете в виду обычный стол, но временно используете? Потому что, если у вас есть SQL, вы можете просто сделать: 'create table temp_table_name как select ...' – sstan

+0

У меня есть запрос на получение данных, но данные будут в вертикальной форме, как в row1 => user, field_name, field_value, row2 => user, field_name, field_value. Например, у меня были бы ["admin", "age", 32], ["admin", "children", 1], ["user", "age", 19], ["user", "children" , 0]. То, что я хочу, это данные в табличной форме, с значениями «field_name» как имена столбцов и значения «field_value» как данные строк, используя только SQL. – valepu

+0

. Вы говорите о повороте. Вы можете легко найти информацию о том, как это сделать. Но имейте в виду, что для поворота вам нужно заранее знать, какие значения 'field_name' вы хотите преобразовать в имена столбцов. – sstan

ответ

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», мой ответ использует/SQL блок PL.

Вы можете заполнить такую ​​таблицу данными, используя аналогичную стратегию. Как уже отмечалось, вы должны знать столбцы во время синтаксического анализа, чтобы обойти это ограничение, вы можете следовать стратегии, например, как это было сделано здесь:

Dynamic Pivot

+0

Я закончил использовать этот https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/ который был предложен в сообщении, которое вы связали – valepu