Oracle 11g Select Distinct不唯一

时间:2012-10-22 05:58:18

标签: sql oracle oracle11g

我有点迷失这个简单的查询

以下是带日期的查询( SERVICE_DATE ):

SELECT DISTINCT JOB_ID,
       SERVICE_DATE,
       GRAND_TOTAL,
       TYPE_INSERT,
       PAYMENT_ID
FROM   TBL_XXX
WHERE  USER_ID = 100
       AND PAYMENT_ID <> 0
ORDER  BY JOB_ID DESC;

我得到了这个结果:

467 18/10/2012  16  Upload  527811
467 18/10/2012  16  Upload  527811
466 18/10/2012  4   Key-In  527806
465 18/10/2012  4   Key-In  527804
464 17/10/2012  24  Upload  527784
464 17/10/2012  24  Upload  527784
464 17/10/2012  24  Upload  527784

此查询没有日期( SERVICE_DATE

SELECT DISTINCT JOB_ID,
       GRAND_TOTAL,
       TYPE_INSERT,
       PAYMENT_ID
FROM   TBL_XXX
WHERE  USER_ID = 100
       AND PAYMENT_ID <> 0
ORDER  BY JOB_ID DESC;

结果:

467 16  Upload  527811
466 4   Key-In  527806
465 4   Key-In  527804
464 24  Upload  527784

我在这里失踪了什么?

3 个答案:

答案 0 :(得分:2)

您的service_date是一个包含时间部分的日期,但您的IDE仅显示日期部分。

要查看detalis,您可以更改IDE的首选项以获取日期或使用格式:

SELECT DISTINCT JOB_ID,
       to_char(SERVICE_DATE,'yyyy-mon-dd hh24:mi:ss'),
       GRAND_TOTAL,
...

答案 1 :(得分:1)

如果有效,请尝试运行此功能,我认为它与您的SERVICE_DATE有关,因此我修改了您的查询以使用ROW_NUMBER()和Windows功能。

SELECT  JOB_ID,
        SERVICE_DATE,
        GRAND_TOTAL,
        TYPE_INSERT,
        PAYMENT_ID
FROM
    (
        SELECT JOB_ID,
               SERVICE_DATE,
               GRAND_TOTAL,
               TYPE_INSERT,
               PAYMENT_ID,
               ROW_NUMBER() OVER (PARTITION BY JOB_ID 
                                  ORDER BY SERVICE_DATE DESC) rn
        FROM   TBL_XXX
        WHERE  USER_ID = 100
               AND PAYMENT_ID <> 0
    ) x
WHERE rn = 1
ORDER BY JOB_ID DESC

答案 2 :(得分:1)

Oracle data type也包含小时,分钟和秒,而您的SQL客户端只显示年 - 月 - 日部分。这种差异导致奇怪的结果。 您可以使用trunc(service_date)仅使用日期部分并保留service_date列的数据类型。