want to optimize the query, for every record two aggregate sub-query is executing which cause performance. plz guide how to optimize this:
select g.GuardianId,
CASE WHEN (select COUNT(*) from tbl_nfctransaction n where n.RefrenceID=g.StudentId and n.tDate=@Date)>0 THEN 1
ELSE 0
END as checkinStatus,
CASE WHEN (select top 1 NfcCardNumber from tbl_nfctransaction where n.RefrenceID=g.StudentId and n.tDate=@Date)='-1' THEN 1
ELSE 0
END as isManualCheckin
from tbl_Guardians g
Would help if you used aliases for the tables to know which column belongs to which table
corrected the query....plz check
corrected the query....plz check
;
WITH cte AS
(
SELECT g.guardianid,
Count(*) AS cnt
FROM tbl_guardians g JOIN tbl_nfctransaction n
ON n.refrenceid = g.studentid AND n.tdate = @Date
GROUP BY g.guardianid )
SELECT g.guardianid,
CASE
WHEN cnt > 0 THEN 1
ELSE 0
END AS checkinstatus
FROM cte
You need an index on tbl_nfctransaction ( tDate, RefrenceID ) include ( NfcCardNumber )
Then:
select g.GuardianId,
CASE WHEN EXISTS(select 1 from tbl_nfctransaction n where n.RefrenceID=g.StudentId and n.tDate=@Date) THEN 1
ELSE 0
END as checkinStatus,
CASE WHEN (select top (1) NfcCardNumber from tbl_nfctransaction n where n.RefrenceID=g.StudentId and n.tDate=@Date)='-1' THEN 1
ELSE 0
END as isManualCheckin
from tbl_Guardians g
select g.GuardianId,
CASE WHEN n.refrenceID is null THEN 0
ELSE 1
END as checkinStatus,
CASE WHEN r.NfcCardNumber ='-1' THEN 1
ELSE 0
END as isManualCheckin
from tbl_Guardians g
left join (select top (1) NfcCardNumber , RefrenceID
from tbl_nfctransaction n where n.tDate=@Date) r
on r.RefrenceID=g.StudentId
Would this work with only joining once to the nfc table? seems suspect
What are you trying to capture with this one?
CASE WHEN (select top 1 NfcCardNumber
from tbl_nfctransaction
where n.RefrenceID=g.StudentId and n.tDate=@Date)='-1'
Seems so random with no order by