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