2

列が少ないテーブルがあり、DB2クエリを使用して次の機能を実現したいと考えています。たとえば、USRテーブルにはユーザーID列とオプションID列があります。

USER ID         OPTION ID
1               1
1               5
1               22
1               100    
1               999

クエリを書きたいのですが、結果は次に利用可能な番号になります。

したがって、最初にクエリが実行されると、次に使用可能なオプションIDが2として返されるはずなので、ユーザーは#2を入力するので、DBは

USER ID  OPTION ID
1         1  
1         2  
1         5  
1        22  
1        100      
1        999  

したがって、クエリが実行されると、使用可能なオプションIDが3として表示されます。正しい結果を得るために最適化されたクエリを取得するのを誰かが手伝ってくれるでしょうか。

4

1 に答える 1

3

option_idユーザーに公開することは、ビジネス要件であろうとなかろうと、ひどい考えだと思うことに注意してください。このようなサロゲート ID は、エンド ユーザーから完全に隠されることを意図しています (クレジット カード番号などの「自然な」キーは明らかに公開する必要がありますが、それでもこの方法で口述するべきではありません)。
以下は、DB2 のどのバージョンでも動作するはずです。

SELECT a.optionid + :nextIncrement as next_value                     
FROM Usr as a                          
LEFT JOIN Usr as b                
       ON b.userid = a.userid                 
          AND b.optionid = a.optionid + :nextIncrement        
WHERE a.userid = :userId      
      AND b.userid IS NULL               
ORDER BY a.optionid ASC
FETCH FIRST 1 ROW ONLY        

(ホスト変数を置き換えて、iSeries インスタンスのローカル テーブルに対して実行されるステートメント)

繰り返しますが、これを使用しないことを強くお勧めします。ビジネス要件の変更について確認してください。

于 2013-02-01T21:28:08.257 に答える