Reputation: 1848
I have the following tables:
MEDIA
MediaID MediaTypeID Title
---------------------------------------------
100 25 Photo of Anton Oliver
200 25 Photo of Hika Eliot
CAMPAIGNS (campaigns use media and belong to pools)
CampaignID MediaID PoolID
----------------------------
1 100 1
2 100 2
3 200 1
CAMPAIGN POOLS
PoolID PoolName
--------------------
1 Pool1
2 Pool2
3 Pool3
Given a specific campaignID
and poolID
passed to the query, I want the following select query to determine whether the media belongs to the passed campaign AND/OR Pool
SELECT m.*
FROM media m
<!--- whatever required joins --->
So, the resulting recordset would look something like this:
MediaData
MediaID MediaTypeID Title BelongsToCampaign BelongsToPool
----------------------------------------------------------------
1 25 xyz 0 1
I hope that makes sense.
Upvotes: 1
Views: 89
Reputation: 57023
I'm not sure from your spec you want the resultset to return all media or only certain subsets (as per @BizApps's answer) -- posting more than two rows of sample data might help here ;)
The following unions the four possible subsets: remove or comment out the ones you don't need. I trust you can see where CTEs could be used to reduce repetition in code:
SELECT m.*, t.BelongsToCampaign, t.BelongsToPool
FROM (
-- Campaign INTERSECT Pool
SELECT c.MediaID, 1 AS BelongsToCampaign, 1 AS BelongsToPool
FROM CAMPAIGNS AS c
WHERE c.CampaignID = @CampaignID
INTERSECT
SELECT MediaID, 1, 1
FROM CAMPAIGN_POOLS AS p JOIN CAMPAIGNS AS c ON p.PoolID = c.PoolID
WHERE p.PoolID = @PoolID
-- Campaign EXCEPT Pool
UNION
SELECT c.MediaID, 1, 0
FROM CAMPAIGNS AS c
WHERE c.CampaignID = @CampaignID
EXCEPT
SELECT MediaID, 1, 0
FROM CAMPAIGN_POOLS AS p JOIN CAMPAIGNS AS c ON p.PoolID = c.PoolID
WHERE p.PoolID = @PoolID
-- Pool EXCEPT Campaign
UNION
SELECT MediaID, 0, 1
FROM CAMPAIGN_POOLS AS p JOIN CAMPAIGNS AS c ON p.PoolID = c.PoolID
WHERE p.PoolID = @PoolID
EXCEPT
SELECT c.MediaID, 0, 1
FROM CAMPAIGNS AS c
WHERE c.CampaignID = @CampaignID
-- Media in neither Pool nor Campaign
UNION
SELECT m.MediaID, 0, 0
FROM MEDIA AS m
EXCEPT
SELECT c.MediaID, 0, 1
FROM CAMPAIGNS AS c
WHERE c.CampaignID = @CampaignID
EXCEPT
SELECT MediaID, 1, 0
FROM CAMPAIGN_POOLS AS p JOIN CAMPAIGNS AS c ON p.PoolID = c.PoolID
WHERE p.PoolID = @PoolID
) AS t
JOIN MEDIA AS m ON m.MediaID = t.MediaID;
Upvotes: 0
Reputation: 11471
select m.MediaID, m.MediaTypeID, m.mediaTitle as Title, c.CampaignID as BelongsToCampaign, cp.PoolID as belongsToPool
from campaings c, media m, campaign_pools cp
where (m.mediaid = c.mediaid) and (c.poolId = cp.poolId) and
(c.campaignID = [your variable] or cp.PoolId = [your other variable])
Upvotes: 0
Reputation: 6130
You can do something like this:
Select MediaID,MediaTypeID,Title,ISNULL(c.CampaignID,0) as BelongsToCampaign,ISNULL(p.PoolID,0) as BelongsToPool
From Media m
LEFT OUTER JOIN Campaign c on m.MediaID=c.MediaID
LEFT OUTER JOIN Pools p on p.PoolID=c.PoolID
where c.CampaignID=@CampaignID OR p.PoolID=@PoolID
Regards
Upvotes: 3