【问题标题】:To display only the active status for one specific id and for same id all status should be disabled要仅显示一个特定 ID 的活动状态,而对于同一 ID,应禁用所有状态
【发布时间】:2017-12-22 07:04:29
【问题描述】:

我想显示仅对一个以“a”开头的应用程序有效且所有其他应用程序应为“已禁用”的人员列表。 人员 ID 在一个表中,应用程序详细信息将在另一个表中。

必须选择满足以下条件的Person id。我附上了我加入三个表的模型结果。我需要选择用户如下(突出显示),

person_id 是主键。

使用的查询如下:

SELECT * FROM  (select   p.person_id from ur_username u join  ur_username_person up on u.username_id=up.username_id 
join ur_person p on up.person_id=p.person_id 
WHERE ( U.USERNAME  LIKE 'A-%' OR U.USERNAME  LIKE 'a-%')
AND u.status='ACTIVE' AND U.ROLE_ID =123 ) E
WHERE p.person_id IN ( select   p.person_id from ur_username u join  ur_username_person up on u.username_id=up.username_id 
join ur_person p on up.person_id=p.person_id 
WHERE ( U.USERNAME  NOT LIKE 'A-%' OR U.USERNAME NOT LIKE 'a-%')
AND u.status='DISABLED' AND U.ROLE_ID =123 )

我也得到了活跃在任何其他应用程序中的人。

在上表中,我希望用户名 a-pri(以 a- 开头)的状态也为“活动”,应用程序 id 123 的所有其他状态都已禁用。该 123 id 没有其他用户名处于活动状态。

【问题讨论】:

  • 您使用的是 MS SQL Server 还是 Oracle?不要标记未涉及的产品。

标签: sql oracle oracle9i


【解决方案1】:

我们可以尝试在Application_id 上进行聚合,然后检查两件事。首先,我们可以检查一个活跃的用户名a-pri 出现一次,而且只出现一次。其次,我们可以断言只有一条记录显示为活动的。这两个条件似乎符合您的要求。

SELECT
    Application_id
FROM yourTable
GROUP BY
    Application_id
HAVING
    SUM(CASE WHEN username='a-pri' AND status='ACTIVE' THEN 1 ELSE 0 END) = 1 AND
    SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) = 1;

点击下面的链接,该链接使用更大的样本数据集来涵盖更多边缘情况。

Demo

【讨论】:

    【解决方案2】:

    可能我没有正确理解您的要求,但这是我的代码:

    Select username from your_rable where status = 'ACTIVE';
    

    如果这不是您打算收到的,请提供更多数据集,可能提供更多 Application_id 以及所需的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多