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),它运行几分钟而不提供任何结果。我觉得我的说法太沉重了,也许我应该换一种完全不同的方式。

骨师

我想你可能有一些复杂的事情。

您可以这样做(假设我已正确理解您的要求),如下所示:

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;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章