添加WHERE条件会破坏SQL ORDER BY排序

时间:2017-03-29 16:40:03

标签: sql oracle

我有一个类似于以下的表定义

MY_TABLE
==========================
PERSON_ID VARCHAR2(9 BYTE)
ACTN_CD   VARCHAR2(8 BYTE)
LOG_DATE  CHAR(10 BYTE)
...

运行SQL:

SELECT * 
FROM MY_TABLE 
WHERE PERSON_ID = '281385010' 
ORDER BY TO_DATE(LOG_DATE, 'MM/DD/YYYY') DESC, ACTN_CD;

返回以下结果。

PERSON_ID ACTN_CD  LOG_DATE
--------- -------- ----------
281385010 COR-ML   06/28/2016
281385010 COR-ML   06/09/2016
281385010 AUD-01   06/08/2016
281385010 COR-PH   05/26/2016
281385010 AUD-01   05/24/2016
281385010 AUD-01   05/16/2016
281385010 TERM     05/03/2016

但是,如果我在声明中指定ACTN_CD匹配:

SELECT * 
FROM MY_TABLE 
WHERE PERSON_ID = '281385010' 
AND ACTN_CD = 'AUD-01' 
ORDER BY TO_DATE(LOG_DATE, 'MM/DD/YYYY') DESC, ACTN_CD;

我的ORDER BY子句似乎被忽略了,结果是;

PERSON_ID ACTN_CD  LOG_DATE
--------- -------- ----------
281385010 AUD-01   05/16/2016
281385010 AUD-01   05/24/2016
281385010 AUD-01   06/08/2016

我很难过为什么添加ACTN_CD标准会破坏我的排序顺序。有没有其他人看到类似的行为?

修改
确切地说,我正在寻找的结果首先按LOG_DATE DESCending排序,然后通过ACTN_CD ASCending排序,如果单个日期有多个动作。只要在WHERE子句中未指定ACTN_CD,这就可以正常工作。我可以在WHERE中逐字地指定表中的任何其他字段,它不会破坏这种排序。

问题解决
我创建了另一个表与原始字段相同的表,并复制了一些数据。对这个新表运行相同的SQL产生了预期的结果,所以我开始寻找差异。事实证明,ACTN_CD是表格中索引的一部分。删除索引修复了排序问题。我不知道在索引字段上排序会导致问题,希望这将有助于将来的其他人。谢谢大家。

1 个答案:

答案 0 :(得分:0)

我创建了另一个表,其中包含与原始字段相同的字段,并复制了一些数据。对这个新表运行相同的SQL产生了预期的结果,所以我开始寻找差异。事实证明,ACTN_CD是表格中索引的一部分。删除索引修复了排序问题。我不知道在索引字段上排序会导致问题,希望这将有助于将来的其他人。谢谢大家。