Oracle单个查询,对同一个表进行多次查找

时间:2015-08-03 05:31:30

标签: sql oracle join

我有一个包含帐号列表的参考表。对于该表中的每个帐户,我需要查询包含活动列表的表;每个活动可以有零到多个相关的音符。每个活动还有一个产品,呼叫类型,原因和结果,它们作为对包含这些内容的类别表的引用存储在一个字段中。只是为了好玩,我必须在一个查询中提取所有这些数据。

这是我到目前为止的地方:

SELECT 
    ACTIVITY.ACTIVITYID, 
    ACTIVITY.ACCOUNTNO, 
    ACTIVITY.CREATEDATETIME, 
    C1.CATDESC AS PRODUCT, 
    C2.CATDESC AS CALLDRIVER, 
    C3.CATDESC AS REASON, 
    C4.CATDESC AS OUTCOME, 
    NOTE.NOTEID, 
    NOTE.NOTEDESC 
FROM NOTE 
RIGHT JOIN ACTIVITY 
    ON NOTE.ACTIVITYID = ACTIVITY.ACTIVITYID 
RIGHT JOIN REFERENCE 
    ON ACTIVITY.ACCOUNTNO = REFERENCE.ACCOUNTNO 
INNER JOIN CATEGORY C1 
    ON ACTIVITY.PRODUCTCODE = C1.CATCODE 
INNER JOIN CATEGORY C2 
    ON ACTIVITY.CALLDRIVERCODE = C2.CATCODE 
INNER JOIN CATEGORY C3 
    ON ACTIVITY.REASONCODE = C3.CATCODE 
INNER JOIN CATEGORY C4 
    ON ACTIVITY.OUTCOMECODE = C4.SOURCECATCODE
WHERE ACTIVITY.CREATEDATETIME >= (SYSDATE -30)
ORDER BY ACTIVITYID, NOTEID

这几乎可以完成我想要它做的事情,除了它返回的行多于它应该的行数(12到40行而不是1-3行)。如果我将联接删除到CATEGORY,就像这样:

SELECT 
    ACTIVITY.ACTIVITYID, 
    ACTIVITY.ACCOUNTNO, 
    ACTIVITY.CREATEDATETIME, 
    NOTE.NOTEID, 
    NOTE.NOTEDESC 
FROM NOTE 
RIGHT JOIN ACTIVITY 
    ON NOTE.ACTIVITYID = ACTIVITY.ACTIVITYID 
RIGHT JOIN REFERENCE 
    ON ACTIVITY.ACCOUNTNO = REFERENCE.ACCOUNTNO 
WHERE ACTIVITY.CREATEDATETIME >= (SYSDATE -30)
ORDER BY ACTIVITYID, NOTEID

然后它按预期完美地工作,所以我知道问题在于重复连接到CATEGORY表。

PRODUCTCODE中的CALLDRIVERCODEREASONCODEOUTCOMECODEACTIVITY字段全部映射到CATCODE(id)和{{1 CATDESC中的(字符串)字段。我正在寻找的是一种逐行查找这些值的替代方法,同时仍然在一个查询中包含所有这些值。

1 个答案:

答案 0 :(得分:1)

作为替代方案,您可以将类别查询放在查询的选择部分中。

select ...
  ,(select c1.catdesc from category c1
    where c1.catcode=activity.productcode)  as product
  ,(select c2.catdesc from category c2
    where c2.catcode=activity.calldrivercode)  as calldriver
...