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