Home > Enterprise >  Select all groups that contain all specified values in a certain column
Select all groups that contain all specified values in a certain column

Time:03-23

Say I have the following table:

CaseRef NotificationReason NotificationDate
123 SCHEDULED 2022-01-01
234 SCHEDULED 2022-01-02
312 SCHEDULED 2022-01-01
123 RESCHEDULED 2022-01-02
123 DECIDED 2022-01-03
234 DECIDED 2022-01-02

If I want to return only rows that have a CaseRef that has both a SCHEDULED and a DECIDED value in NotificationReason.

CaseRef NotificationReason NotificationDate
234 SCHEDULED 2022-01-02
234 DECIDED 2022-01-02
123 SCHEDULED 2022-01-01
123 RESCHEDULED 2022-01-02
123 DECIDED 2022-01-03

I wrote the below which works fine and only excludes the one row, but I was wondering if this is the most efficient way of constructing such a query?

SELECT * 
FROM @Notifications
WHERE CaseRef IN (SELECT CaseRef FROM @Notifications
                  WHERE NotificationReason = 'SCHEDULED')
  AND CaseRef IN (SELECT CaseRef FROM @Notifications
                  WHERE NotificationReason = 'DECIDED')
ORDER BY CaseRef DESC

Thanks.

CodePudding user response:

Your query should be reasonably fast for checking two statuses. But in case you want to check many statuses an alternate would be:

select *
from t
where caseref in (
    select caseref
    from t
    where notificationreason in ('SCHEDULED', 'DECIDED')
    group by caseref
    having count(distinct notificationreason) = 2
)

CodePudding user response:

Your query is OK but returns and additional row with NotificationReason RESCHEDULED so it should be:

select * FROM Notifications
where CaseRef in (select CaseRef from Notifications
where NotificationReason = 'SCHEDULED')
AND CaseRef in (select CaseRef from Notifications
where NotificationReason = 'DECIDED')
and NotificationReason<>'RESCHEDULED'
order by CaseRef desc

fiddler http://sqlfiddle.com/#!18/2bf412/17 And if you want to know the efficiency of a query check the execution plan

  • Related