Значения строк в заголовках столбцов в Oracle - PullRequest
0 голосов
/ 01 сентября 2018

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

Ввод: таблица

Item   Class   Attribute  Attribute_Val
------ ------- ---------- -------------
Apple  Fruit   Name       Gala 
Apple  Fruit   Color      Red 
Apple  Fruit   Origin     USA
Apple  Fruit   Price      3 
Mango  Fruit   Name       Alphonso
Mango  Fruit   Color      Yellow 
Mango  Fruit   Origin     MEX, IND
Mango  Fruit   Price      5

Ожидаемый вывод: из представления БД

Item   Class   Name     Color  Origin  Price
------ ------- -----    ------ ------  -----
Apple  Fruit   Gala     Red    USA     3
Mango  Fruit   Alphonso Yellow MEX,IND 5

Допустим, завтра добавлен новый атрибут (Сезон) для класса "Фрукты". В результате во входной таблице будет 2 строки (по одной для элементов Apple и Mango), и представление должно иметь возможность динамически добавлять новый столбец «Сезон» к своему выводу.

Может ли это быть сделано с помощью Oracle View или Function?

1 Ответ

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

Используйте PIVOT:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( Item, Class, Attribute, Attribute_Val ) AS
SELECT 'Apple', 'Fruit', 'Name',   'Gala'     FROM DUAL UNION ALL
SELECT 'Apple', 'Fruit', 'Color',  'Red'      FROM DUAL UNION ALL
SELECT 'Apple', 'Fruit', 'Origin', 'USA'      FROM DUAL UNION ALL
SELECT 'Apple', 'Fruit', 'Price',  '3'        FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Name',   'Alphonso' FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Color',  'Yellow'   FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Origin', 'MEX, IND' FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Price',  '5'        FROM DUAL;

Запрос 1 :

SELECT *
FROM   table_name
PIVOT ( MAX( Attribute_Val ) FOR Attribute IN (
  'Name'   AS name,
  'Color'  AS color,
  'Origin' AS origin,
  'Price'  AS price
) )

Результаты

|  ITEM | CLASS |     NAME |  COLOR |   ORIGIN | PRICE |
|-------|-------|----------|--------|----------|-------|
| Mango | Fruit | Alphonso | Yellow | MEX, IND |     5 |
| Apple | Fruit |     Gala |    Red |      USA |     3 |

Допустим, завтра добавлен новый атрибут (Сезон) для класса "Фрукты". В результате во входной таблице будет 2 строки (по одной для элементов Apple и Mango), и представление должно иметь возможность динамически добавлять новый столбец «Сезон» к своему выводу.

Нет, это невозможно. Представление имеет фиксированное количество столбцов, определенное при его компиляции, и добавление данных (или столбцов) в родительскую таблицу не обновит представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...