2015-07-26 5 views
0

Прошло много времени с тех пор, как я сделал больше, чем самые основные SQL-запросы. Но я столкнулся с этим сегодня и потратил на это несколько часов, и я застрял в моей производной попытке таблицы (это для Oracle db). Ищите несколько советов. Спасибо.Oracle query stumped - производная таблица

TABLE: dtree 
DataID Name 
------------- 
10001 A.doc 
10002 B.doc 
10003 C.doc 
10004 D.doc 

TABLE: collections 
CollectionID DataID 
--------------------- 
201  10001 
201  10002 
202  10003 
203  10004 

TABLE: rimsNodeClassification 
DataID RimsSubject RimsRSI Status 
--------------------------------------- 
10001 blah   IS-03 Active 
10002 blah   LE-01 Active 
10003 blah   AD-02 Active 
10004 blah   AD-03 Active 

TABLE: rsiEventSched 
RimsRSI RetStage DateToUse RetYears 
-------------------------------------- 
IS-03 SEM-PHYS 95  1 
IS-03 ACT  NULL  2 
LE-01 SEM-PHYS 94  1 
LE-01 INA-PHYS 95  2 
LE-01 ACT  NULL  NULL 
LE-01 OFC  NULL  NULL 
LE-02 SEM-PHYS 94  2 

Попытка запроса на CollectionID = 201

INTENDED RESULT: 
DataID Name RimsRSI Status SEMPHYS_DateToUse INAPHYS_DateToUse  SEMPHYS_RetYears INAPHYS_RetYears 
------------------------------------------------------------------------------------------------------- 
10001 A.doc IS-03 Active 95    null      1    null 
10002 B.doc Le-01 Active 94    95     1     2 
+0

Не могли бы вы быть более ясными относительно того, в чем именно заключается ваш вопрос? –

ответ

1

Вам не нужно производной таблицы, просто присоединиться к таблицам (последний с использованием LEFT JOIN), а затем применить MAX (CASE) агрегирование:

select c.DataID, t.Name, rnc.RimsRSI, rnc.Status, 
    max(case when res.RetStage = 'SEM-PHYS' then res.DateToUse end) SEMPHYS_DateToUse, 
    max(case when res.RetStage = 'INA-PHYS' then res.DateToUse end) INAPHYS_DateToUse, 
    max(case when res.RetStage = 'SEM-PHYS' then res.RetYears end) SEMPHYS_RetYears, 
    max(case when res.RetStage = 'INA-PHYS' then res.RetYears end) INAPHYS_RetYears 
from collections c 
join dtree t 
    on c.DataID = t.DataID 
join rimsNodeClassification rnc 
    on c.DataID = rnc.DataID 
left join rsiEventSched res 
    on rnc.RimsRSI = res.RimsRSI 
where c.CollectionID= 201 
group by c.DataID, t.Name, rnc.RimsRSI, rnc.Status 
+0

Спасибо, дноет. Очень полезно, я был пойман, пытаясь выбрать из производной таблицы, где я использовал max case, чтобы объединить несколько строк в одну строку с несколькими столбцами. :) – GeneralZod