Создание набора результатов на основе имени столбца, определенного в другой таблице в Oracle - PullRequest
0 голосов
/ 14 сентября 2018

В базе данных Oracle у меня есть таблица DATA_DUMP_TABLE с общими именами столбцов

id    column1     column2    column3   column4   column5  def_id
1      John         Doe        null     null        null      1
2      Tom          Baker      null     null        null      1

Затем у меня есть таблица метаданных COLUMN_DEF, которая определяет имена столбцов данных.Это может варьироваться в зависимости от определения идентификатора.Скажем, в этом случае я просто хочу отобразить первые 2 столбца.

def_id   mapped_column     mapped_column_val`   
1         column1              First Name
1         column2               Last Name

Ожидаемый набор результатов основан на mapped_column_val из таблицы COLUMN_DEF

Таким образом, в этом случае набор результатов будет выглядеть следующим образом

id       First Name         Last Name
1          John              Doe
2          Tom               Baker

Как сделатьЯ достигаю этого в оракуле, может ли это быть сделано через SQL, или я должен использовать предварительные пакеты?Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Работает с сервером sql.

DECLARE @new_names     as nvarchar(MAX)
DECLARE @sql           as nvarchar(MAX)

SELECT @new_names = STRING_AGG('[' + MAPPED_COLUMN_VAL + ']', ',') FROM COLUMN_DEF

SET @sql =  'SELECT * FROM (
    SELECT t.ID, t.COLUMN_VALUES, t.DEF_ID, c.MAPPED_COLUMN_VAL FROM (
        SELECT ID, COLUMN_NAME, COLUMN_VALUES, DEF_ID 
        FROM 
            (SELECT * FROM DUMP_DATA) d
        UNPIVOT
            (
                COLUMN_VALUES FOR COLUMN_NAME IN
                    (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5)
            ) unpvt
    ) AS t LEFT OUTER JOIN 
    COLUMN_DEF c ON t.COLUMN_NAME = c.MAPPED_COLUMN
) b
PIVOT
(
    MAX(COLUMN_VALUES) FOR MAPPED_COLUMN_VAL IN ( ' + @new_names + ' )
    --IN ([FIRST NAME], [LAST NAME])
) AS pivot_table;'

EXEC dbo.SP_EXECUTESQL @sql

Unpivot Удаляет столбцы со значениями NULL.

ВХОД:

ID  COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5 DEF_ID
1   JOHN    DOE NULL    NULL    NULL    1
2   TOM BAKER   NULL    NULL    NULL    2

DEF_ID  MAPPED_COLUMN   MAPPED_COLUMN_VAL
1   COLUMN1 FIRST NAME
2   COLUMN2 LAST NAME

РЕЗУЛЬТАТ:

ID  DEF_ID  FIRST NAME  LAST NAME
1   1   JOHN    DOE
2   2   TOM BAKER
0 голосов
/ 14 сентября 2018

В общем, я думаю, что для этого требуется pl / sql и динамический SQL, как указано в @ gordon-linoff

Это очень близко.

Create table temp_sgc1(id number, column1 Varchar2(20), column2 varchar2(20));
Insert into temp_sgc1 values(1 ,     'John'     ,    'Doe');
Insert into temp_sgc1 values(2 ,     'Tom'     ,    'Baker');



Create table temp_sgc2(def_id  number, mapped_column Varchar2(20), mapped_column_va

l

varchar2(20));
Insert into temp_sgc2 values(1,         'column1',              'First Name');
Insert into temp_sgc2 values(1,         'column2',              'Last Name');

Select * from 
(select * from temp_sgc2
pivot ( 
 max(mapped_column_val) for mapped_column in ( 'column1' column1, 'column2' column2 )
)
order by def_id)
union all
Select id,    column1,     column2
from temp_sgc1

;

РЕЗУЛЬТАТ:

    DEF_ID COLUMN1              COLUMN2             

     1 First Name           Last Name           
     1 John                 Doe                 
     2 Tom                  Baker       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...