Can you please help me to determine if these 2 SELECTs are equivalent?
SELECT sd.SESSION_DATA_ID
FROM SessionData sd
WHERE sd.DEVICE_TYPE = 'TRAC'
AND (EXISTS
(SELECT sr.ID
FROM SessionResult sr
LEFT JOIN BarcodeValues bv ON
sr.BARCODE_VALUE_0 = bv.ID AND
sr.SESSION_DATA_ID = sd.SESSION_DATA_ID AND
sr.EVENT_NAME = 'Multi Full Cntr'
WHERE
bv.ENCRYPTED_VALUE LIKE '' OR bv.ENCRYPTED_VALUE IS NULL))
SELECT
DISTINCT sd.SESSION_DATA_ID
FROM SessionData sd
LEFT JOIN SessionResult sr ON sd.SESSION_DATA_ID = sr.SESSION_DATA_ID
LEFT JOIN BarcodeValues bv ON bv.ID = sr.BARCODE_VALUE_0
WHERE
sd.DEVICE_TYPE = 'TRAC' AND
(sr.EVENT_NAME = 'Multi Full Cntr' AND
bv.ENCRYPTED_VALUE LIKE '' OR bv.ENCRYPTED_VALUE IS NULL) OR
sr.EVENT_NAME is NULL
This makes it different
OR sr.EVENT_NAME is NULL
First will not match on sr.EVENT_NAME is NULL
Second will match on sr.EVENT_NAME is NULL
The second will match in two situations
– no match on sd.SESSION_DATA_ID = sr.SESSION_DATA_ID
– match on sd.SESSION_DATA_ID = sr.SESSION_DATA_ID and sr.EVENT_NAME is NULL
I suspect the first select is not doing what you think it is doing
The OR IS NULL in the WHERE will return rows where the join does not match
The following are NOT equivalent
I suspect this is what you mean / want is:
AND is processed before OR
Operator Precedence (Transact-SQL)