Соединения и условия - PullRequest
       6

Соединения и условия

1 голос
/ 11 апреля 2011

Мне нужно получить имя активности, где delesw = '0' и eventdtm = sysdate-12. Но я думаю, что для того, чтобы получить полное название деятельности, она делает само присоединение. Но я не уверен, как включить эти условия в этот запрос. Может кто-нибудь, пожалуйста, помогите

SELECT  
  (DECODE(levelLess3.activitynm, NULL, '', levelLess3.activitynm || '/') ) || 
 (DECODE(levelLess2.activitynm, NULL, '', levelLess2.activitynm || '/') ) || 
 (DECODE(levelLess1.activitynm, NULL, '', levelLess1.activitynm || '/') ) || 
   wa.activitynm as ACTIVITYFULLNM
  FROM wfaactivity wa
    LEFT OUTER JOIN WFAACTIVITY levelless1 ON (wa.parentid = levelless1.wfaactivityid
   AND levelless1.wfaactivityid != wa.wfaactivityid)
 LEFT OUTER JOIN WFAACTIVITY levelless2 ON (levelless1.parentid = levelless2.wfaactivityid
   AND levelless2.wfaactivityid != levelless1.wfaactivityid)
 LEFT OUTER JOIN WFAACTIVITY levelless3 ON (levelless2.parentid = levelless3.wfaactivityid
   AND levelless3.wfaactivityid != levelless2.wfaactivityid)

Я хочу включить условие типа

where wa.wfaactivityid=wspan.wfaactivityid
and wspan.deletedsw='0'
and to_char(wspan.eventdtm, 'yyyymmdd') >= to_char(sysdate-12,'yyyymmdd')

wspan - это еще одна таблица, из которой мы берем удаленные и eventdtm

да, я дал так

SELECT  
  (DECODE(levelLess3.activitynm, NULL, '', levelLess3.activitynm || '/') ) || 
 (DECODE(levelLess2.activitynm, NULL, '', levelLess2.activitynm || '/') ) || 
 (DECODE(levelLess1.activitynm, NULL, '', levelLess1.activitynm || '/') ) || 
   wa.activitynm as ACTIVITYFULLNM
  FROM wfaactivity wa,WFAREPACTYSPAN wspan
  where
  wa.wfaactivityid=wspan.wfaactivityid
and wspan.deletedsw='0'
and to_char(wspan.eventdtm, 'yyyymmdd') >= to_char(sysdate-12,'yyyymmdd')
and
    LEFT OUTER JOIN WFAACTIVITY levelless1 ON (wa.parentid = levelless1.wfaactivityid
   AND levelless1.wfaactivityid != wa.wfaactivityid)
 LEFT OUTER JOIN WFAACTIVITY levelless2 ON (levelless1.parentid = levelless2.wfaactivityid
   AND levelless2.wfaactivityid != levelless1.wfaactivityid)
 LEFT OUTER JOIN WFAACTIVITY levelless3 ON (levelless2.parentid = levelless3.wfaactivityid
   AND levelless3.wfaactivityid != levelless2.wfaactivityid)

Но я получаю ошибку ORA-00920 Недопустимый реляционный оператор

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Ваш выбор неудачен, потому что вы помещаете условия соединения в предложение where.Попробуйте вместо этого:

Select (DECODE(levelLess3.activitynm, Null, '', levelLess3.activitynm || '/') ) || 
       (DECODE(levelLess2.activitynm, Null, '', levelLess2.activitynm || '/') ) || 
       (DECODE(levelLess1.activitynm, Null, '', levelLess1.activitynm || '/') ) || 
       wa.activitynm As ACTIVITYFULLNM
  From wfaactivity wa
  Join WFAREPACTYSPAN wspan On wa.wfaactivityid=wspan.wfaactivityid
  Left Outer Join WFAACTIVITY levelless1 On (wa.parentid = levelless1.wfaactivityid
                                             And levelless1.wfaactivityid != wa.wfaactivityid)
  Left Outer Join WFAACTIVITY levelless2 On (levelless1.parentid = levelless2.wfaactivityid
   And levelless2.wfaactivityid != levelless1.wfaactivityid)
  Left Outer Join WFAACTIVITY levelless3 On (levelless2.parentid = levelless3.wfaactivityid
   And levelless3.wfaactivityid != levelless2.wfaactivityid)
 Where wspan.deletedsw='0'
   And TO_CHAR(wspan.eventdtm, 'yyyymmdd') >= TO_CHAR(SYSDATE-12,'yyyymmdd')

РЕДАКТИРОВАТЬ

Вы можете присоединиться к любым таблицам по своему усмотрению, но вы должны быть уверены в том, как вы присоединяетесьих.Из вашего вопроса и комментария кажется (извините, если это не так), вы не очень знакомы с объединениями SQL.

Если это так, я предлагаю вам прочитать это отличное объяснение SQL-соединений .В зависимости от того, как вы присоединяетесь к таблицам, вы можете не получить нужные данные.

HTH

0 голосов
/ 11 апреля 2011

Похоже, вы пытаетесь построить иерархию - почему бы вместо этого не использовать иерархический запрос?

select reverse (sys_connect_by_path (reverse (wf.activitynm), '/') as activityfullnm
  from wfaactivity wf
       inner join wfarepactyspan wspan
          on wa.wfaactivityid = wspan.wfaactivityid
 start with (     wspan.deletedsw = 0 and 
              and wspan.eventdtm >= sysdate - 12)
 connect by nocycle prior wf.wfactivityid = wf.parentid 
 where level <= 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...