2

このタイプのクエリを使用して、データベースから「最後に」挿入されたレコードを抽出したい

SELECT A.IDOC_NUM, A.SEG_NUM
FROM  AGR3PL_LINE A, AGR3PL_IDOC B
WHERE A.IDOC_NUM(+) = B.IDOC_NUM
AND B.IDOC_NUM = '457154' AND B.CREATION_DATE = (SELECT MAX(B.CREATION_DATE) FROM AGR3PL_IDOC B)
ORDER BY A.SEG_NUM DESC;

結果は次のとおりです。

IDOC_NUM SEG_NUM
457154     9
457154     8
457154     7
457154     6
457154     5
457154     4
457154     3
457154     2
457154     10
457154     1

これは正しいですが、エントリ 10 が最後に入力されていますが、ご覧のとおり、フォーマットの結果は良くありません。10,9,8 である必要があります....データベースに問題があるのでしょうか?

4

4 に答える 4

3

さて、SEG_NUM は「文字列」型 (VARCHAR2 またはその他) として格納されます。

列の種類を NUMBER に設定すると、並べ替えがうまくいきます。

于 2012-06-11T13:04:44.547 に答える
2

おそらくSEG_NUMテキスト型(例えばVARCHAR)なので、数字のようにソートされていません。

この列の型を変更するか (数値の場合は数値型にする必要があるため、これが最適なソリューションです)、または実行中にこの列の型を変換できます (パフォーマンスが低下する可能性があります)。

SELECT A.IDOC_NUM, A.SEG_NUM 
FROM  AGR3PL_LINE A, AGR3PL_IDOC B 
WHERE A.IDOC_NUM(+) = B.IDOC_NUM 
AND B.IDOC_NUM = '457154' AND B.CREATION_DATE = (SELECT MAX(B.CREATION_DATE) FROM AGR3PL_IDOC B) 
ORDER BY TO_NUMBER(A.SEG_NUM) DESC;
于 2012-06-11T13:04:49.697 に答える
2
ORDER BY TO_NUMBER(A.SEG_NUM) DESC;
于 2012-06-11T13:07:20.700 に答える
1

問題は SEG_NUM が varchar の場合のようです。したがって、2 よりも小さい 10 を扱っています。

このようにしてください -

ORDER BY to_number(A.SEG_NUM) DESC
于 2012-06-11T13:05:54.873 に答える