SQL Server-查询帮助
我有以下表格: 媒体 活动使用媒体,属于池SQL Server-查询帮助,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下表格: 媒体 活动使用媒体,属于池 CampaignID MediaID PoolID ---------------------------- 1 100 1 2 100 2 3 200 1 竞选资金池 给定传递给查询的特定活动ID和池ID,我希望下面的select查询确定媒体是否属于传递的活动和/或池 SELECT m.* FROM media m <!--- wh
CampaignID MediaID PoolID
----------------------------
1 100 1
2 100 2
3 200 1
竞选资金池
给定传递给查询的特定活动ID和池ID,我希望下面的select查询确定媒体是否属于传递的活动和/或池
SELECT m.*
FROM media m
<!--- whatever required joins --->
我希望这是有意义的。您可以这样做:
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])
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
关于根据您的规范,我不确定您是否希望结果集按照@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;
这不是标准的tsql语法。我认为在不指定连接类型的情况下,逗号默认为内部连接,这不符合他的要求。此外,我认为他希望0代表空值,所以在select部分需要一个isnull语句。。。连接语法-这是传统的,如果您碰巧忘记了连接条件,这是很危险的,因为在WHERE子句中,连接条件和实际WHERE条件都混合在一起,这很混乱-使用ANSI连接语法内部连接,而不是左外部连接!
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])
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
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;