在使用rownum 时发现,rownum 的位置不同导致查询出的数据和预期不一样。
先说结论:
Oracle会先设置行的rownum,再进行order by
执行顺序:rownum > order by
一:错误sql分析
sql
SELECT
J.*,
ROWNUM
FROM
JYZB_ACCOUNT_DETAIL J
WHERE
( ACCOUNT_ID = '1435866772258516994' AND ROWNUM <= 10)
ORDER BY
id ASC;
结果
分析:
- 在
oracle 中默认的排序按 ROWID伪列递增排序。将条件查询的结果后使用rouwnum 函数将查询的结果顺序标记一个序号(起始1开始计数) rownum<=10 ,取记好数的前十个。 ORDER BY 是将上述的结果集再按id升序排序。
上述分解sql执行
第一步:
SELECT
J.*,
ROWNUM
FROM
JYZB_ACCOUNT_DETAIL J
WHERE
ACCOUNT_ID = '1435866772258516994'
第二步:
SELECT
J.*,
ROWNUM
FROM
JYZB_ACCOUNT_DETAIL J
WHERE
ACCOUNT_ID = '1435866772258516994' AND ROWNUM <= 10
第三步:
SELECT
J.*,
ROWNUM
FROM
JYZB_ACCOUNT_DETAIL J
WHERE
ACCOUNT_ID = '1435866772258516994'
AND ROWNUM <= 10
ORDER BY
id ASC;
二、正确sql
应该是先order by,先包一层查询,再赋rownum值
SELECT
D.* ,
ROWNUM
FROM
( SELECT * FROM JYZB_ACCOUNT_DETAIL WHERE ( ACCOUNT_ID = '1435866772258516994' ) ORDER BY id ASC ) D
WHERE
ROWNUM <= 10
结果
|