我是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,除了A之外的任何内容都出现在该Fruit的任何行的Value1中
从上表中,查询应该提供如下所示的结果:
| Fruit | Value1| Value2|
--------------------------
| PEAR | A | |
| PEAR | | X |
| CHERRY | A | |
| CHERRY | | X |
| CHERRY | A | |
| CHERRY | | X |
| ORANGE | A | |
| ORANGE | | X |
| ORANGE | | Y |
| ORANGE | | Z |
对我来说似乎有点棘手的部分是在行组级别执行多次检查,但仍返回匹配组的所有行。
提前感谢您提供的提示和建议。如果您需要我澄清这个问题,请告诉我。该数据库是z / OS上的DB2 V10。
答案 0 :(得分: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')