2013-01-18 49 views
-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 |  | 

從上面的表格,我想選擇一個給定的水果,其中值1是一個在一行中的所有行,值2爲X以下行,無非是其他出現在值1的任何爲那個水果排。

從上面的表格,查詢應提供的結果是這樣的:

| Fruit | Value1| Value2| 
-------------------------- 
| PEAR | A |  | 
| PEAR |  | X  | 
| CHERRY | A |  | 
| CHERRY |  | X  | 
| CHERRY | A |  | 
| CHERRY |  | X  | 
| ORANGE | A |  | 
| ORANGE |  | X  | 
| ORANGE |  | Y  | 
| ORANGE |  | Z  | 
  • 蘋果是一個後排除,因爲該行其中值1 = A, 值2 = X。
  • 該圖被排除,因爲Value2 = X發生在Value1 = A之前的行, 而不是之後的行。
  • GRAPE被排除,因爲Value1 = A時沒有行。
  • PEACH被排除,因爲至少有一行Value1!= A。
  • MANGO被排除,因爲Value1 = A沒有行,並且因爲 沒有行,其中Value2 = X。

對我來說似乎有點棘手的部分是在行組級別執行幾次檢查,但仍返回匹配組的所有行。

在此先感謝您的提示和建議。讓我知道你是否需要我澄清這個問題。數據庫是z/OS上的DB2 V10。

+1

什麼是「下一行」呢?那就是,你爲了得到你看到的訂單而命令什麼?例如,如果你有以下順序的三行((PEAR,A,NULL),(PEAR,NULL,Y),(PEAR,NULL,X)),你不希望PEAR被返回,對嗎? –

+0

這是正確的。對於此選擇,每當A出現在Value1中時,X必須出現在表格中下一行的Value2中。 – mlowry

+0

再一次澄清可能會顯着改變查詢: Value1中的兩個或更多個連續的A實例可以。所以((PEAR,A,NULL),(PEAR,A,NULL),(PEAR,NULL,X))都可以。我沒有在表格中看到實例,但我可以想象它們存在。在這種情況下,我想要檢索所有PEAR行。總結:對於任意數量的連續(,A,NULL)行的組,下一行不是(,A,NULL)應該是(,NULL,X)。 – mlowry

回答

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') 
+0

有趣。感謝您的回覆。 正如我所看到的,此查詢基於以下假設: 1. Value2 = X在Value1 = A之前的情況很少,或者將以另一種方式處理(例如,您的FIG註釋)。 2.在組內,項目已經以期望的輸出順序出現。 我看它應該如何工作,但我不確定條件(f2.fruit = fruits.fruit)是否足夠具體。如果fruit是數據庫表的名稱,則此比較始終爲真。我想你的意思是比較內部選擇中的列和外部選擇中的列。 – mlowry

+0

這裏是我的修改: select * from fruits f1 不存在水果(選擇水果中的value1不爲空且value1 <>''且value1 <>'A') 且存在(從水果中選擇水果f2其中f2.fruit = f1.fruit和value2 ='X') – mlowry

+0

我今天早上測試了這個查詢,並相信它讓我足夠接近我所追求的。在這一點上,我只需要滿足上述標準的球場數量。稍後,我可能需要重新審視這一點,並獲得更準確的結果。 再次感謝您的回覆! – mlowry

相關問題