-1

我是 SQL 新手,所以我不确定哪种方法最适合此类任务:

我有一个表,其中行组都与同一项目相关,其名称出现在第一列。其他详细信息显示在其他列中。我正在尝试根据第一列中的相同值来检索每个组的所有行,其中每次某个值出现在一个列中时,另一个值出现在下一行的不同列中。

 | 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    |       |

从上表中,我想为给定的 Fruit 选择所有行,其中 Value1 在一行上是 A,Value2 在下一行是 X,在该 Fruit 的任何行上的 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     |
  • APPLE 被排除在外,因为在 Value1=A,Value2!=X 的行之后。
  • 由于 Value2=X 出现在 Value1=A 之前的行上,而不是之后的行上,因此排除了 FIG。
  • GRAPE 被排除在外,因为没有 Value1=A 的行。
  • PEACH 被排除在外,因为至少有一行 Value1!=A。
  • MANGO 被排除在外,因为没有 Value1=A 的行,并且没有 Value2=X 的行。

对我来说似乎有点棘手的部分是在行组级别执行多项检查,但仍返回匹配组的所有行。

提前感谢您的提示和建议。如果您需要我澄清这个问题,请告诉我。数据库是 z/OS 上的 DB2 V10。

4

1 回答 1

0

除了需要一个订单列(id 或其他)的图(在您的示例中)之外,下面的查询可以解决您的问题:

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 回答