2017-05-30 48 views
0

返回COUNT(*)我有我最初的声明是:的Oracle SQL相关子查询 - 在一些列

SELECT TEAM.ID PKEY_SRC_OBJECT, 
    TEAM.MODF_DAT UPDATE_DATE, 
    TEAM.MODF_USR UPDATED_BY, 
    PERSO.FIRST_NAM FISRT_NAME 
    FROM TEAM 
    LEFT OUTER JOIN PERSO ON (TEAM.ID=PERSO.TEAM_ID) 

我想计算一些“标志”和我最初的发言归还。 有3个标志,其可以这样来计算:

1)标志ISMASTER:

SELECT Count(*) 
FROM TEAM_TEAM_REL A, TEAM B 
WHERE B.PARTY_PTY_ID = A.RLTD_TEAM_ID 
AND CODE = 'Double'; 

2)标志ISAGENT:

SELECT Count(*) 
FROM TEAM_ROL_REL A, TEAM B 
WHERE B.PARTY_PTY_ID = A.TEAM_ID; 

3)标志NUMPACTS:

SELECT Count(*) 
FROM TEAM_ROL_REL A, 
TEAM_ROL_POL_REL B, 
PERSO_POL_STA_REL C, 
TEAM D 
WHERE A.ROL_CD IN ('1','2') 
AND A.T_ROL_REL_ID = B.P_ROL_REL_ID 
AND B.P_POL_ID = C.P_POL_ID 
AND C.STA_CD = 'A' 
AND D.PARTY_PTY_ID = A.TEAM_ID; 

为了达到这个目的,我已经更新了我的初始语句:

WITH ABC AS (
    SELECT TEAM.ID PKEY_SRC_OBJECT, 
    TEAM.MODF_DAT UPDATE_DATE, 
    TEAM.MODF_USR UPDATED_BY, 
    PERSO.FIRST_NAM FISRT_NAME 
    FROM TEAM 
    LEFT OUTER JOIN PERSO ON (TEAM.ID=PERSO.TEAM_ID) 
) 

SELECT ABC.*, MAST.ISMASTER, AGENT.ISAGENT, PACTS.NUMPACTS FROM ABC 
LEFT OUTER JOIN (
    select 
    RLTD_TEAM_ID, 
    Count(RLTD_TEAM_ID) OVER (PARTITION BY RLTD_TEAM_ID) as ISMASTER 
    FROM TEAM_TEAM_REL 
    WHERE CODE = 'Double' 
) MAST 
ON ABC.PKEY_SRC_OBJECT = MAST.RLTD_TEAM_ID 

LEFT OUTER JOIN (
    select 
    TEAM_ID, 
    Count(TEAM_ID) OVER (PARTITION BY TEAM_ID) as ISAGENT 
    FROM TEAM_ROL_REL 
) AGENT 
ON ABC.PKEY_SRC_OBJECT = AGENT.TEAM_ID 

LEFT OUTER JOIN (
    select 
    TEAM_ID, 
    Count(TEAM_ID) OVER (PARTITION BY TEAM_ID) as NUMPACTS 
    FROM TEAM_ROL_REL, TEAM_ROL_POL_REL, PERSO_POL_STA_REL 
    WHERE TEAM_ROL_REL.ROL_CD IN ('1','2') 
    AND TEAM_ROL_REL.T_ROL_REL_ID = TEAM_ROL_POL_REL.P_ROL_REL_ID 
    AND TEAM_ROL_POL_REL.P_POL_ID = PERSO_POL_STA_REL.P_POL_ID 
    AND PERSO_POL_STA_REL.STA_CD = 'A' 
) PACTS 
ON ABC.PKEY_SRC_OBJECT = PACTS.TEAM_ID; 

对于两个第一标志(ISMASTER和ISAGENT)我得到的结果,在不到1分钟,但最后的标志(NUMPACTS)运行几分钟,而不提供任何结果。 我认为我的发言太重了,也许我应该以完全不同的方式去做。

+0

运行解释计划并发布结果。 – OldProgrammer

回答

1

我想你或许有过复杂的事情。

你可以这样做(假设我理解正确的您的要求),像这样:

WITH ttr AS (SELECT rltd_team_id, 
         COUNT(*) is_master 
       FROM team_team_rel 
       AND CODE = 'Double' 
       GROUP BY rltd_team_id), 
     trr AS (SELECT team_id, 
         COUNT(*) is_agent 
       FROM team_rol_rel 
       GROUP BY team_id) 
    pacts AS (SELECT trr1.team_id, 
         COUNT(*) num_pacts 
       FROM team_rol_rel trr1 
         INNER JOIN team_rol_pol_rel trpr ON (trr1.t_rol_rel_id = trpr.p_rol_rel_id) 
         INNER JOIN perso_pol_sta_rel ppsr ON (trpr.p_pol_id = ppsr.p_pol_id 
       WHERE trr1.rol_cd IN ('1', '2') 
       AND ppsr.st_cd = 'A' 
       GROUP BY trr1.team_id) 
SELECT t.id pkey_src_object, 
     t.modf_dat update_date, 
     t.modf_usr updated_by, 
     p.first_nam first_name, 
     ttr.is_master, 
     trr.is_agent, 
     pacts.num_pacts 
FROM team t 
     LEFT OUTER JOIN perso p ON t.id = p.team_id 
     LEFT OUTER JOIN ttr ON t.party_pty_id = ttr.rltd_team_id 
     LEFT OUTER JOIN trr ON t.party_pty_id = trr.team_id 
     LEFT OUTER JOIN pacts ON t.pkey_src_object = pacts.team_id; 

注:未经测试,因为您没有提供任何测试数据。

+1

这样工作很好,谢谢! – baboufight