返回具有另一个值的所有字段的SQL值-如果存在另一个值

时间:2019-01-21 14:05:01

标签: sql oracle

我一直在与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。

2 个答案:

答案 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”,这意味着我们可以在该列上进行过滤。