0

我想获取具有区域 62 和 69 但没有区域 200 和 92 的数据,我正在使用此查询,但这不起作用

select  rtp1.releaseId, rtp1.territoryId
from ReleaseTerritoryPrice rtp1
where rtp1.territoryId  in (62,69)
  and not exists (select releaseId
                  from ReleaseTerritoryPrice t2
                  where t2.territoryId in (200,92)
                    and rtp1.releaseId = t2.releaseId);

任何帮助?谢谢。

4

1 回答 1

2

这是集合内集合查询的示例。我喜欢为此使用带有having子句的聚合,因为这是一种非常灵活的方法:

select ReleaseId
from ReleaseTerritoryPrice
group by ReleaseId
having (sum(case when territoryId = 62 then 1 else 0 end) > 0 and
        sum(case when territoryId = 69 then 1 else 0 end) > 0
       ) and
       (sum(case when territoryId = 200 then 1 else 0 end) = 0 and
        sum(case when territoryId = 92 then 1 else 0 end) = 0
       )

子句中的每个条件都在having计算每个地区的行数。前两个表示62并且69必须存在(计数大于 1)。最后两个是这样说的200并且92不存在(计数为 0)。

例如,如果您想更改它以便只需要 和 中的一个62而不69需要其他两个,则该having子句将是:

having (sum(case when territoryId = 62 then 1 else 0 end) > 0 or
        sum(case when territoryId = 69 then 1 else 0 end) > 0
       ) and
       (sum(case when territoryId = 200 then 1 else 0 end) = 0 and
        sum(case when territoryId = 92 then 1 else 0 end) = 0
       )
于 2013-06-06T15:53:26.527 回答