-1

私はSQLが初めてなので、この種のタスクに最適なアプローチがわかりません。

行のグループがすべて同じ項目に関連しているテーブルがあり、その名前が最初の列に表示されます。その他の詳細は、他の列に表示されます。最初の列に同じ値があることに基づいて、すべてのグループのすべての行を取得しようとしています。特定の値が 1 つの列に表示されるたびに、次の行の別の列に別の値が表示されます。

 | Fruit  | Value1| Value2|
 --------------------------
 | APPLE  |  A    |       |
 | APPLE  |       | E     |
 | PEAR   |  A    |       |
 | PEAR   |       | X     |
 | FIG    |       | X     |
 | FIG    |  A    |       |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | GRAPE  |       | X     |
 | GRAPE  |       | T     |
 | ORANGE |  A    |       |
 | ORANGE |       | X     |
 | ORANGE |       | Y     |
 | ORANGE |       | Z     |
 | PEACH  |  B    |       |
 | PEACH  |  A    |       |
 | PEACH  |       | X     |
 | MANGO  |  B    |       |
 | MANGO  |  C    |       |
 | MANGO  |  D    |       |

上記のテーブルから、特定の果物のすべての行を選択したいと思います。ここで、Value1 は 1 つの行の A であり、Value2 は次の行の X であり、その果物の行の Value1 には A 以外は何も表示されません。

上記の表から、クエリは次のような結果を返す必要があります。

 | Fruit  | Value1| Value2|
 --------------------------
 | PEAR   |  A    |       |
 | PEAR   |       | X     |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | CHERRY |  A    |       |
 | CHERRY |       | X     |
 | ORANGE |  A    |       |
 | ORANGE |       | X     |
 | ORANGE |       | Y     |
 | ORANGE |       | Z     |
  • Value1=A、Value2!=X の行の次の行にあるため、APPLE は除外されます。
  • Figure は、Value1=A の後の行ではなく、Value2=X の前の行に発生するため、除外されます。
  • Value1=A の行がないため、GRAPE は除外されます。
  • Value1!=A の行が少なくとも 1 行あるため、PEACH は除外されます。
  • Value1=A の行がなく、Value2=X の行もないため、MANGO は除外されます。

私には少し難しいと思われる部分は、行のグループのレベルでいくつかのチェックを実行していますが、それでも一致するグループのすべての行を返します。

ヒントや提案をお寄せいただきありがとうございます。質問を明確にするために私が必要な場合はお知らせください。データベースは z/OS 上の DB2 V10 です。

4

1 に答える 1

0

注文列(idなど)を必要とするFIG(あなたの例では)を除いて、以下のクエリはあなたの問題を解決します:

select * from fruits 
where fruit not in (select fruit from fruits where value1 is not null and value1 <> '' and value1 <> 'A')
and exists (select fruit from fruits f2 where f2.fruit = fruits.fruit and value2 = 'X')
于 2013-01-18T22:30:00.707 に答える