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

これは、set-within-sets クエリの例です。これは非常に柔軟なアプローチであるため、私はこれに 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各地域の行数をカウントしています。最初の 2 つは、62and69が存在する必要があることを示しています (カウントが 1 より大きい)。200最後の 2 つは存在しないと言ってい92ます (カウントは 0)。

例として、これを変更して、62との 1 つだけ69が必要で、他の 2 つが不要な場合、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 に答える