从ORACLE数据库中选择记录

时间:2012-06-11 13:02:31

标签: sql oracle

我想使用这种类型的查询

从数据库中提取“最后”插入的记录
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 个答案:

答案 0 :(得分:3)

嗯,SEG_NUM存储为"字符串" type(VARCHAR2或其他)。将列类型设置为NUMBER,排序就可以了。

答案 1 :(得分: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;

答案 2 :(得分:2)

ORDER BY TO_NUMBER(A.SEG_NUM) DESC;

答案 3 :(得分:1)

问题似乎是SEG_NUM在你的情况下是varchar。因此它将低于2的10处理。

这样做 -

ORDER BY to_number(A.SEG_NUM) DESC