2014-10-14 5 views
1

Я работаю над разработчиком PL/SQL v10 в базе данных Oracle 11g. Идея заключается в том, вместо того, чтобы писать 145 столбцов, перечисленных в PIVOT заявлении написать Pivot XML и получить данные оттуда, I am working on a basis of this answer, как я никогда не делал PIVOT XML, прежде чем на Oracle, так что мои ожидания могут быть ошибочнымиPIVOT или PIVOT XML без прямого перечисления столбцов на Oracle

select * from (
        select 
         tqs.transactiondetailid as transactiondetailid, 
         q.productid as productid, 
         tqs.answer as QAnswer, 
         regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') as QDesc, 
         tqs.transactionversion as transactionversion 
        from TRANSACTIONDETAILQS tqs 
        inner join question q on q.questionid = tqs.questionid and (
          q.questiondescription like 'DT%' 
          or q.questiondescription like 'WT%' 
          or q.questiondescription like 'WIF%') 
    ) pivot xml(
    min(QAnswer) for QDesc in (
    select regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') as r from question q 
    where regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') IS NOT NULL) 
    ) 

в столбце XML делает не возвращают никаких данных все они пусты, однако после заявления, где я столбцы списка явно работает просто отлично

select * from (
        select 
         tqs.transactiondetailid as transactiondetailid, 
         q.productid as productid, 
         tqs.answer as QAnswer, 
         regexp_substr(q.questiondescription,'(WIF|DT|WT)[([:digit:]|.)]*') as QDesc, 
         tqs.transactionversion as transactionversion 
        from TRANSACTIONDETAILQS tqs 
        inner join question q on q.questionid = tqs.questionid and (
          q.questiondescription like 'DT%' 
          or q.questiondescription like 'WT%' 
          or q.questiondescription like 'WIF%') 
    ) pivot (
    min(QAnswer) for QDesc in (
    'DT01.','DT02.','WT01.') 
    ) 

Как поворачивать без перечисления столбцов в явном виде?

+0

не определен, но ваш 'regexp_substr (q.questiondescription, '(WIF | DT | WT) ...' может быть неправильным. Что произойдет, если вы уменьшите сложность и попытаетесь вывести только одно имя столбца в соответствие, прежде чем пытаться получить все из них? Удачи. – shellter

+0

@shellter 9 месяцев спустя я понял, где проблема, см. обновление. :) –

ответ

2

Я варил вниз к проблеме

min(QAnswer) for QDesc In (
    select 'DT01.','DT02.','WT01.' from dual) 
) 

не работает, но

min(QAnswer) for QDesc In (
    'DT01.','DT02.','WT01.') 
) 

работает нормально.

Один из способов сделать это - create dynamic PL/SQL, но для этого мне не хватает храбрости.