2

ここでは単純化しすぎていますが、助けが必要です。次のような SQL ステートメントがあるとします。

SELECT * FROM Policy p
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE OtherPolicyFile.Status IN (9,10)

では、話はここまでです。ステータスが 11 の OtherPolicyFile もプルする必要がありますが、ステータスが 9 または 10 の一致する OtherPolicyFile がある場合のみです。

つまり、通常はステータス 11 の OtherPolicyFile をプルすることはありませんが、そのポリシーにステータス 9 または 10 の OtherPolicyFile もある場合は、ステータス 11 の OtherPolicyFile もプルする必要があります。

これを書くにはおそらく本当に簡単な方法がありますが、私は現時点で困惑しており、フープを飛び越えずに私に到達することはできません. どんな助けでも大歓迎です。

4

3 に答える 3

3

追加の左結合を 1 つ実行し、左結合テーブルの NULL をテストします。

SELECT p.*, o.* 
FROM Policy p
    JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
    LEFT JOIN OtherPolicyFile o9or10 
        on o9or10.PolicyId = p.PolicyId and o9or10.Status IN (9,10)
WHERE o.Status IN (9,10)
    OR o.Status = 11 AND o9or10.PolicyId is NOT NULL
GROUP BY <whatever key you need>

ただし、注意してください - 追加された LEFT JOIN が行を複製しないように、GROUP BY を使用する必要があります。あなたのスキーマがわからないため、適切なキーを提案できません。適切なキーを入力してください (おそらく、OtherPolicyFile のプライマリ ID? あなたの場合は o.ID のようなもの? しかし、私は本当に知りません)

于 2013-06-29T17:04:32.773 に答える
2

サブクエリを追加して、9 または 10 が存在するかどうかを確認します。これがフィドルです:http://sqlfiddle.com/#!3/1a68c/2

SELECT * FROM Policy p
JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
WHERE o.Status IN (9,10)
OR (o.Status = 11 AND
    exists (select * from OtherPolicyFile innerO 
              where innerO.PolicyId = p.PolicyId 
              and (innerO.Status = 9 or innerO.Status=10)))
于 2013-06-29T16:59:47.173 に答える
2

これが最高のパフォーマンスを発揮すると信じています。結合しないことに注意してください。

SQL Server 2005+でのみ実行されます

これが機能するためには、'select *' ができず、両方のテーブルで同じ列名を持つことができないことに注意してください。したがって、必要な列を指定する必要があります。

SELECT * from 
(
  SELECT  <your columns>, 
  statuscheck = min(nullif(o.status, 11)) over (partition by o.PolicyId)
  FROM Policy p
  JOIN OtherPolicyFile o on o.PolicyId = p.PolicyId 
  WHERE o.Status IN (9,10,11)
) a
WHERE statuscheck is not null
于 2013-06-29T17:38:57.703 に答える