2015-11-27 6 views
1

У меня есть 3 стола.Создать вид из 3 таблиц

table1

id info1 info2 
1 a  b 
2 a  b 
3 a  b 
4 a  b 

table2

id table1_id column_id value 
1 1   1  10 
2 1   2  20 
3 1   3  30 
4 2   1  40 
5 2   2  50 
6 2   3  60 
7 3   1  70 
8 3   2  80 
9 3   3  90 
10 4   1  100 
11 4   2  110 
12 4   3  120 

Таблица3

column_id column 
1   column1 
2   column2 
3   column3 

Исходя из вышесказанного, мне нужно, чтобы создать представление, которое будет преобразовывать строки в столбцы следующим образом:

column1 column2 column3 
10  20  30 
40  50  60 
70  80  90 
100  110  120 

Возможно ли создать такой вид, как указано выше?

+0

Какова таблица 1, связанная с выходом, который вам нужен? –

+0

Можете ли вы опубликовать код, что вы пробовали до сих пор? – Buddi

+0

@WernerWaage записи в представлении должны быть равны количеству записей в таблице1. – dang

ответ

1

Вы можете использовать ниже, если вы используете Oracle 11g или выше вы можете использование свод тоже.

SELECT max(CASE 
       WHEN column1 = 'column1' 
        THEN value1 
       END) column1 
     ,max(CASE 
       WHEN column1 = 'column2' 
        THEN value1 
       END) column2 
     ,max(CASE 
       WHEN column1 = 'column3' 
        THEN value1 
       END) column3 
    FROM (
     SELECT t2.table1_id 
      ,t3.column1 
      ,to_char(t2.value1) AS value1 
     FROM table2 t2 
     JOIN table1 t1 ON t1.id1 = t2.table1_id 
     JOIN table3 t3 ON t3.column_id = t2.column_id 
     ) 
    GROUP BY table1_id 
+0

Это работает. Но у меня есть 60 столбцов, таких как column1, column2, column3. Есть ли способ автоматизировать? – dang

+0

@dang Насколько я знаю, мы не можем автоматизировать его с помощью SQL-запроса. Но мы можем сделать это на уровне pl/sql – Buddi

0

Короткий ответ на вопрос: да, решением проблемы может быть объединение таблиц, а затем их поворот.

Я написал код, как предложение, чтобы помочь вам вместе, это непроверенный код, и вам придется настроить его немного

select * from (
     select T1.id as Row, T3.column, T2.value 
     from table1 T1 
     left join table2 T2 on T2.table1_id = T1.id 
     left join table3 T3 on T3.column_id = T2.column_id 

    ) 
    pivot 
    (
     sum(value) 
     for value in ('column1','column2','column3') 
    ) 
    group by row 
    order by row 
+0

это не работает. – dang

+0

Что не работает? Это не производственный код, но скорее как предложение для решения –

+0

Я получаю сообщение об ошибке - ORA-00923: FROM ключевое слово не найдено там, где ожидалось 00923. 00000 - «Ключевое слово FROM не найдено, где ожидалось» * Причина: * Действие : Ошибка на линии: 6 Столбец: 33 – dang

Смежные вопросы