2011-04-11 179 views
1

我需要获取其中deletedsw ='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的条件是,我们正在采取deletedsw和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无效的关系运算符

+0

那么,当你添加WHERE子句时,问题在哪里呢?任何errros?你也只需要加入wspan。 – 2011-04-11 09:43:04

+0

嗨,请参阅编辑后 – Remya 2011-04-11 10:51:26

回答

1

您的选择失败,因为您将连接条件放入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连接不是很熟悉。

如果是这样,我建议你阅读这个excellent explanation on SQL joins。根据你如何加入表格,你可能无法获得你想要的数据。

HTH

+0

嗨Guillem感谢您的答复。我有一个疑问,如果我需要再加入一个表X说我可以加入它像从wfaactivity wa加入WFAREPACTYSPAN wspan在wa.wfaactivityid = wspan.wfaactivityid JOIN x x在xy = wspan.spanid – Remya 2011-04-11 12:01:03

+0

嗨@Remya,请检查编辑的答案。 – 2011-04-11 12:45:41

+0

嗨Guillem非常感谢你的答复。是的你是对的,我在PLSQL连接方面经验不足。感谢这篇文章 – Remya 2011-04-18 04:06:36

0

它看起来像你想建立一个层次 - 为什么不使用分层查询呢?

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