Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-查询帮助_Sql_Sql Server_Tsql - Fatal编程技术网

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;