Oracle: материализованное представление с уникальными предметами из плоского стола - PullRequest
1 голос
/ 08 июня 2011

Я работаю над Oracle.У меня есть эта большая таблица индексаторов свойств (THE_TABLE), столбцы которой

[ObjectID | CategoryID | Property1 | Property2 | ... | PropertyN]

, где N известно по проекту.Все столбцы Property% имеют VARCHAR2 одинакового размера, ObjectID - числовой.Теперь я хотел бы создать материализованное представление, содержащее результаты следующих запросов:

select distinct CategoryID, (select 'Property1' from dual) as PropertyName, Property1 as PropertyValue from THE_TABLE

select distinct CategoryID, (select 'Property2' from dual) as PropertyName, Property2 as PropertyValue from THE_TABLE

...

select distinct CategoryID, (select 'PropertyN' from dual) as PropertyName, PropertyN as PropertyValue from THE_TABLE

Другими словами, представление (THE_VIEW) должно содержать три столбца:

[CategoryID | PropertyName | PropertyValue]

и сможет возвращать уникальные значения, связанные с конкретным CategoryID.Есть ли способ создать такое представление?

Обратите внимание, что у меня нет возможности изменить THE_TABLE.

С уважением, Андреа

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Мне не достаточно, если я правильно понимаю ваш вопрос, но я верю, что вы хотите что-то вроде

create materialied view THE_VIEW as
  select categoryID, 'property1' propertyName, property1 propertyValue from THE_TABLE union all
  select categoryID, 'property2' propertyName, property2 propertyValue from THE_TABLE union all
     ...
  select categoryID, 'propertyN' propertyName, propertyN propertyValue from THE_TABLE
;
2 голосов
/ 08 июня 2011

Если вы используете Oracle 11g, вы можете попробовать новые функции pivot / unpivot.

Эта статья - отличное прочтение, но в целом вам нужноUNPIVOT в этом случае.Например (на данный момент я не использую экземпляр 11g, так что это общий пример):

SQL> SELECT *
  2  FROM   pivoted_data;

JOB           D10_SAL    D20_SAL    D30_SAL    D40_SAL
---------- ---------- ---------- ---------- ----------
CLERK            1430       2090       1045
SALESMAN                               6160
PRESIDENT        5500
MANAGER          2695     3272.5       3135
ANALYST                     6600

5 rows selected.


SQL> SELECT *
  2  FROM   pivoted_data
  3  UNPIVOT (
  4               deptsal                              --<-- unpivot_clause
  5           FOR saldesc                              --<-- unpivot_for_clause
  6           IN  (d10_sal, d20_sal, d30_sal, d40_sal) --<-- unpivot_in_clause
  7          );

JOB        SALDESC       DEPTSAL
---------- ---------- ----------
CLERK      D10_SAL          1430
CLERK      D20_SAL          2090
CLERK      D30_SAL          1045
SALESMAN   D30_SAL          6160
PRESIDENT  D10_SAL          5500
MANAGER    D10_SAL          2695
MANAGER    D20_SAL        3272.5
MANAGER    D30_SAL          3135
ANALYST    D20_SAL          6600

9 rows selected.

Еще один вариант для тех, кто на 11g.

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