0

私の目標は、クエリを作成してから、CI フィールドを「1」に更新する update ステートメントを作成することですが、max(vt_end) が sysdate よりも小さく、max( vt_end ) に対して更新されたレコードがまだない場合にのみです。その特定のコードの 31-dec-9999 の。以下に基本的なクエリを示しますが、更新するレコードだけを特定する方法がわかりません。

SELECT CODE,
     MAX (VT_END),
     TT_STOP,
     MOST_RECENT_IND AS MRI,
     CURRENT_IND AS CI
FROM TABLE
WHERE TT_STOP > SYSDATE AND CODE IN ('0001F', '0001M', '0001T')
GROUP BY CODE,
     VT_END,
     MOST_RECENT_IND,
     CURRENT_IND
ORDER BY CODE, VT_END


CODE    VT_END       TT_STOP    MRI CI  
0001F   12/31/2004  12/31/9999  0   0  
0001F   12/31/2006  12/31/9999  0   0  
0001F   3/31/2007   12/31/9999  0   0  
0001F   12/31/2007  12/31/9999  0   0  
0001F   12/31/2011  12/31/9999  0   0  
0001F   12/31/2012  12/31/9999  0   0  
0001F   12/31/9999  12/31/9999  1   1  
0001T   12/31/2003  12/31/9999  0   0  
0001T   12/31/2004  12/31/9999  0   0  

私もこのクエリを試しましたが、「31-dec-9999」のレコードが既にあるため、0001F 12/31/2012 のレコードが返されるため、間違っています。

SELECT CODE,
     MAX (VT_END),
     MOST_RECENT_IND AS MRI,
     CURRENT_IND AS CI
FROM SRC_PROCDR_DESCRIPTOR_SCD2
WHERE TT_STOP > SYSDATE AND CODE IN ('0001F', '0001M', '0001T')
AND VT_END <> '31-dec-9999'
GROUP BY CODE,
     MOST_RECENT_IND,
     CURRENT_IND
ORDER BY CODE

Incorrect Results:
CODE    VT_END       TT_STOP    MRI CI 
0001F   12/31/2012  0   0
0001T   12/31/2004  0   0

結果は

CODE    VT_END       TT_STOP    MRI CI 
0001T   12/31/2004  12/31/9999  0   0   - Update to '1' on CI  
--This should be the only record returned in the above query to put into an 
UPDATE statement.
4

1 に答える 1

0

を使用してMAX()いますが、使用する必要があります。使用すると、異なる行の値を混在させることができるため、 と の両方を使用して更新する必要があるとEXISTS思います。MAX()CODEVT_END

SELECT CODE, VT_END
FROM TABLE1
WHERE TT_STOP > SYSDATE
  AND CODE IN ('0001F', '0001M', '0001T')
  AND VT_END <> '31-dec-9999'
  AND NOT EXISTS(SELECT * FROM TABLE1 T1
    WHERE T1.CODE=TABLE1.CODE -- join condition
      AND T1.VT_END>TABLE1.VT_END) -- filter condition
ORDER BY CODE

これは、最大値がそうでない場合にのみ、VT_ENDそれぞれの最大値を持つ行を返します(最大の日付を取得し、既に更新された行を除外します)。CODEVT_END'31-dec-9999'NOT EXIST (...)VT_END <> '31-dec-9999'

于 2017-09-17T18:18:46.763 に答える