我一直在与Oracle挣扎,并且作为一个初学者,希望有人能提供建议。
我们有一个带有多个表的Assyst数据库。我正在尝试做的是报告act_reg中所有包含event.incident_id的条目-但仅当该act_reg中至少有一个特定的serv_dept_id出现时才如此。
我知道像泥一样清澈
我一直在尝试WHERE EXISTS子句,但是,如果该行专门包含我要查找的serv_dept_id,而不是仅event_id与之匹配,它似乎只会返回该行。并非所有带有event_id的条目都出现一次或多次。
在下面的示例中,有少量的伪代码(Action和Team的两个选择行),因为它们链接到其他表,并且不在请求的范围内。
select incident.incident_ref "Call Ref",
act_reg.date_actioned "Date Actioned",
act_reg.action "Action",
act_reg.team "Team"
from incident, act_reg
where incident.incident_id = act_reg.incident_id
and exists (
SELECT jptsys_svd_group.svd_group_id
FROM serv_dept act_svd_2, jptsys_svd_group
WHERE act_svd_2.serv_dept_id = act_reg.serv_dept_id
AND act_svd_2.svd_group_id = jptsys_svd_group.svd_group_id
AND jptsys_svd_group.svd_group_sc = 'TEAM 1 GROUP'
)
我期望的是(假设第1团队属于上述第1团队,但没有其他团队):
Call Ref | Date Actioned | Action | Team
--------------------------------------------
27 | 01/01/2019 | Assign | Team 1
27 | 01/01/2019 | Update | Team 2
27 | 02/01/2019 | Info | Team 2
27 | 02/01/2019 | Close | Team 1
我得到的是:
Call Ref | Date Actioned | Action | Team
--------------------------------------------
27 | 01/01/2019 | Assign | Team 1
27 | 02/01/2019 | Close | Team 1
任何帮助将不胜感激。我不确定从这里要去哪里。
以下示例数据:
Call Ref | Date Actioned | Action | Team
--------------------------------------------
27 | 01/01/2019 | Assign | Team 1
28 | 01/01/2019 | Create | Team 3
29 | 01/01/2019 | Create | Team 4
27 | 01/01/2019 | Update | Team 2
27 | 02/01/2019 | Info | Team 2
31 | 02/01/2019 | Update | Team 2
27 | 02/01/2019 | Close | Team 1
我希望看到的是呼叫参考的所有行,如果(在这种情况下)团队1已经对其执行了一项操作。因此,在上面的示例数据中,这将返回调用参考为27的所有行,因为在该参考的某些行中存在团队1。
答案 0 :(得分:1)
如果我正确理解了您的问题,则您的WHERE EXISTS
子句与主体部分中的行的act_reg.serv_dept_id
相关,这听起来像不是您想要的。假设incident_id
不在其他两个表中(这将有助于查看查询中所有表的结构),则必须再次拉入act_reg
。尝试使用EXISTS
子句:
and exists (
SELECT jptsys_svd_group.svd_group_id
FROM serv_dept act_svd_2, jptsys_svd_group, act_reg AS ACT_REG2
WHERE ACT_REG2.incident_id = act_reg.incident_id
AND act_svd_2.serv_dept_id = ACT_REG2.serv_dept_id
AND act_svd_2.svd_group_id = jptsys_svd_group.svd_group_id
AND jptsys_svd_group.svd_group_sc = 'TEAM 1 GROUP'
)
答案 1 :(得分:1)
您可以使用分析功能来实现您的目标-在这里我使用MAX() OVER ()
,但如果需要,可以使用COUNT() OVER ()
来实现:
WITH your_table AS (SELECT 27 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Assign' action, 'Team 1' team FROM dual UNION ALL
SELECT 28 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Create' action, 'Team 3' team FROM dual UNION ALL
SELECT 29 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Create' action, 'Team 4' team FROM dual UNION ALL
SELECT 27 call_ref, to_date('01/01/2019', 'dd/mm/yyyy') date_actioned, 'Update' action, 'Team 2' team FROM dual UNION ALL
SELECT 27 call_ref, to_date('02/01/2019', 'dd/mm/yyyy') date_actioned, 'Info' action, 'Team 2' team FROM dual UNION ALL
SELECT 31 call_ref, to_date('02/01/2019', 'dd/mm/yyyy') date_actioned, 'Update' action, 'Team 2' team FROM dual UNION ALL
SELECT 27 call_ref, to_date('02/01/2019', 'dd/mm/yyyy') date_actioned, 'Close' action, 'Team 1' team FROM dual)
SELECT call_ref,
date_actioned,
action,
team
FROM (SELECT call_ref,
date_actioned,
action,
team,
MAX(CASE WHEN team = 'Team 1' THEN team END) OVER (PARTITION BY call_ref) team_interested_in
FROM your_table)
WHERE team_interested_in = 'Team 1';
CALL_REF DATE_ACTIONED ACTION TEAM
---------- ------------- ------ ------
27 01/01/2019 Assign Team 1
27 01/01/2019 Update Team 2
27 02/01/2019 Info Team 2
27 02/01/2019 Close Team 1
这可以通过将团队转换为Team 1
(我们感兴趣的值)或NULL来工作。然后,我们找到MAX值并将其应用于组中的所有行(基于call_ref)。
如果“团队1”出现在任何行中,则我们的新列将包含所有行的“团队1”,这意味着我们可以在该列上进行过滤。