I am running SQL Server 2012 and have constructed a query to minus results one primary from another. I have done this a few ways one being:
SELECT
campaignContact_id,
nlLogID,
emailAddress
FROM
sm_rel_campaign_contact rcc
WHERE
rcc.campaignContact_id NOT IN (SELECT campaignContact_id
FROM SM_BOUNCES)
AND rcc.campaigncontact_id NOT IN (SELECT campaignContact_id
FROM SM_DEFERRALS )
AND rcc.campaignContact_id NOT IN (SELECT campaignContact_id
FROM SM_FAILS)
AND rcc.campaignContact_id NOT IN (SELECT campaignContact_id
FROM SM_SENDS )
Another being :
ALTER VIEW SM_QUEUE
AS
(
SELECT
campaignContact_id,
nlLogID,
emailAddress
FROM
sm_rel_campaign_contact rcc
WHERE
NOT EXISTS (SELECT * FROM SM_BOUNCES smb
WHERE rcc.campaignContact_id = smb.campaignContact_id)
AND NOT EXISTS (SELECT * FROM SM_DEFERRALS smd
WHERE rcc.campaignContact_id = smd.campaignContact_id)
AND NOT EXISTS (SELECT * FROM SM_FAILS smf
WHERE rcc.campaignContact_id = smf.campaignContact_id)
AND NOT EXISTS (SELECT * FROM SM_SENDS sms
WHERE rcc.campaignContact_id = sms.campaignContact_ID)
)
The issue is when I run this guy after I create the view (either way):
SELECT count(*)
FROM SM_QUEUE
WHERE nlLogID = 81505
it's running incredibly slow! I know you can index views but I wanted to see if anyone had a better suggestion? LEFT OUTER JOIN
's maybe?
Appreciate any feedback in advance.