基于COUNT()

时间:2017-02-06 21:35:31

标签: sql sql-server

我迷上了查询的逻辑,我需要一些帮助。首先,我有一个父表Campaigns。然后,子表CampaignParks看起来像这样:

select * from CampaignParks

enter image description here

出于商业原因,我不会厌倦你,我们需要将公园包含在广告系列表中,即使它们未包含在广告系列中。要将它们实际包含在广告系列中,就会有一个标志。可以将无,一个或多个Park设置为包含在广告系列中。

确定。很简单。现在...

鉴于@ParkID,我需要返回ParkID匹配的所有父广告系列,但仅限于广告系列的IncludeInCampaign个标记中的一个(或多个)已设置。如果没有设置给定广告系列的IncludeInCampaign个标记,那么我们只是忽略@Parks的值。我们不关心它。

示例:

  • @ParkID = 11070.我们回到4& 1
  • @ParkID = 11526.我们回来1
  • @ParkID = 26496.我们回来1
  • @ParkID = null。我们回到了4& 1
  • ParkID = 69.我们回来1。

所以,我认为查询看起来像这样:

SELECT
    DISTINCT
    sc.ContactID,
    cp.*
FROM
    Campaigns sc
    JOIN CampaignParks cp on sc.CampaignID = cp.CampaignID
WHERE 
    ((SELECT COUNT(*) FROM CampaignParks cp2 WHERE cp2.CampaignID = sc.CampaignID AND cp2.IncludeInCampaign = 1) > 0 OR cp.ParkID = @ParkID)

但是,这并没有让我得到正确的结果。

(我需要带女儿去体操......我回来时会看看依赖。谢谢!)

1 个答案:

答案 0 :(得分:0)

我认为你的代码很接近。主要区别在于AND子句中的ORWHERE

SELECT sc.ContactID, cp.*
FROM Campaigns c JOIN
     CampaignParks cp
     on sc.CampaignID = cp.CampaignID
WHERE cp.ParkId = @ParkId AND
      EXISTS (SELECT 1
              FROM CampaignParks cp2
              WHERE cp2.CampaignID = cp.CampaignID AND
                    cp2.IncludeInCampaign = 1
             );