SQL Proc中的排序顺序

时间:2016-05-25 11:26:21

标签: sql oracle sorting oracle12c

查询

SELECT B.TYPE,
                B.TYPE_VAL,
                B.COMP,
                B.start,
                B.end,
                B.lt,
                B.modify
           FROM table B
         WHERE B.start <= sysdate
          AND B.end >= sysdate
            AND TRIM(B.type_val) IN
                ('111-AAA')
          ORDER BY B.type_val,
                   B.type,
                   B.comp DESC;

输出

+------+----------+------+-----------+------------+----+-----------------+
| TYPE | TYPE_VAL | COMP |   START   |    END     | LT |     MODIFY      |
+------+----------+------+-----------+------------+----+-----------------+
| AS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| AS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 68 | 3/8/2016 0:34   |
| BS   | 111-AAA  | **   | 6/16/2015 | 6/16/2015  |  7 | 6/16/2015 10:32 |
| CS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| CS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| HS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| HS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| MS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| MS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| OS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| OS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| PS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| PS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| S    | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| S    | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| VS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| VS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
+------+----------+------+-----------+------------+----+-----------------+

如果您发现正在提取的数据采用latest one first then older one

的形式

例如TYPE AS -

| AS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |
| AS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 68 | 3/8/2016 0:34   |

最新数据,即2016年5月10日首先是2016年3月8日。(MM / DD / YY格式)

但是这里有一个例外,TYPE PS - 3/8/2016 is above 5/10/2016与其他所有例外情况不同。

| PS   | 111-AAA  | **   | 3/8/2016  | 12/31/9999 | 13 | 3/8/2016 0:34   |
| PS   | 111-AAA  | **   | 5/10/2016 | 12/31/9999 |  1 | 5/10/2016 11:12 |

根据我的知识,如果排序顺序相同(TYPE,TYPE_VAL和COMP相同,所以没有排序),理想情况下最新的那个应该在顶部。

我的问题是 - 为什么这个特定记录的顺序是相反的?难道不应该像所有其他百万条记录被拉出来一样吗?必须有一些特殊原因,为什么会发生这种情况。

我知道你们中的大多数人都会提到Oracle没有特别的方式来返回行,但这不是这种情况。

4 个答案:

答案 0 :(得分:2)

如果未指定显式ORDER BY,则数据库基本上可以按其认为合适的任何顺序返回行。这个可以是插入顺序,但不一定是。

如果您想对start列进行排序,请将其添加到ORDER BY

       ORDER BY B.type_val,
               B.type,
               B.comp DESC,
               B.start;

答案 1 :(得分:2)

您的order by条款是:

ORDER BY B.type_val, B.type, B.comp DESC;

您的记录对对这三列具有完全相同的值。因此,它们可以按任何顺序出现。如果有些人在&#34;右边&#34;这是巧合。 order,因为查询没有提供正确排序的信息。

如果您希望按特定顺序使用它们,则需要在ORDER BY中包含该信息。例如:

ORDER BY B.type_val, B.type, B.comp DESC, B.Modify DESC

答案 2 :(得分:1)

确切地说,如果没有在列(MODIFY专门)上指定任何顺序,则结果集的行可以按该列的任何顺序返回,或者根本不返回任何顺序。 Oracle,MS Sql,任何其他数据库都将以相同的方式运行。为什么某些特定行在MODIFY上有这个特殊排序,而其他行有不同的排序?我不相信我们可以知道它,涉及太多因素。

答案 3 :(得分:0)

如果您未在订单查询中包含列,则数据库可以订购或不订购其他列,但您不能假定订购

注意你使用的SQL提供程序(MySQL,Orache ......),每个人都可以工作不同。