2011-09-05 109 views
1

我有以下表格:SQL服务器 - 查询帮助

MEDIA

MediaID  MediaTypeID Title 
--------------------------------------------- 
100   25   Photo of Anton Oliver 
200   25   Photo of Hika Eliot 

CAMPAIGNS(活动使用媒体和属于池)

CampaignID MediaID PoolID 
---------------------------- 
1   100  1 
2   100  2 
3   200  1 

CAMPAIGN藏

PoolID  PoolName 
-------------------- 
1   Pool1 
2   Pool2 
3   Pool3 

给出了具体的campaignIDpoolID传递给查询,我想下面的选择查询,以确定媒体是否属于通过运动和/或池

SELECT m.* 
FROM media m 
<!--- whatever required joins ---> 

所以,结果记录会看是这样的:

MediaData

MediaID MediaTypeID Title BelongsToCampaign BelongsToPool 
---------------------------------------------------------------- 
1   25    xyz  0     1 

我希望这是有道理的。

回答

3

你可以做这样的事情:

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 [email protected] OR [email protected] 

问候

+0

+1 yep。这应该很好。 – deutschZuid

0
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]) 
+0

这不是标准的tsql语法。我认为没有指定连接的类型,逗号默认为内部连接,这不符合他的要求。除此之外,我认为他希望0为null值,所以在select部分中需要一个isnull语句。 – deutschZuid

+0

不要使用来自广告系列c,媒体m,...的旧式''JOIN语法 - 它是遗留的,如果您碰巧忘记了JOIN条件会很危险,因为您最终拥有JOIN条件和实际的WHERE在WHERE子句中将所有混合在一起的条件 - 使用** ANSI JOIN **语法('INNER JOIN','LEFT OUTER JOIN')来代替! –

0

我不知道从你的天赋,你想要的结果集返回所有媒体或只有特定的子集(按@ BizApps的答案) - 发布两行以上的示例数据可能对此有所帮助;)

以下联合使用四种可能的子集:删除或注释掉不需要的子集。我相信你可以看到CTE可以用来减少代码中的重复:

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;