我有一个包含帐号列表的参考表。对于该表中的每个帐户,我需要查询包含活动列表的表;每个活动可以有零到多个相关的音符。每个活动还有一个产品,呼叫类型,原因和结果,它们作为对包含这些内容的类别表的引用存储在一个字段中。只是为了好玩,我必须在一个查询中提取所有这些数据。
这是我到目前为止的地方:
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
中的CALLDRIVERCODE
,REASONCODE
,OUTCOMECODE
和ACTIVITY
字段全部映射到CATCODE
(id)和{{1 CATDESC
中的(字符串)字段。我正在寻找的是一种逐行查找这些值的替代方法,同时仍然在一个查询中包含所有这些值。
答案 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
...