問題描述:oracle數據庫order by排序不唯一,會導致最終的數據排序是不是穩定的,表現出來的結果,就是分頁時會重複顯示; 症狀如下:第2頁和第3頁有重複的數據。
有問題的sql:
select
*
from
( select
u.user_id user_id,
u.user_name user_name,
u.mobile1 mobile,
substr(u.id_no,
-4) id_no,
i.industry_name industry_name,
to_char(su.organ_type) organ_type,
su.organ_name group_name,
su.train_date train_date,
0 assign_status,
'未分配' assign_status_name
from
szfdc.szfdc_users su
join
sec_users u
on u.user_id = su.id
join
sec_user_group_rel ug
on u.user_id = ug.user_id
left join
t_industry i
on i.organ_type = su.organ_type
where
(
su.organ_type in (
512, 1024,2048
)
or su.organ_type is null
)
and ug.group_id = 10000000313
order by
su.train_date desc nulls last)
where
rownum <= 20;
問題解決:建議在 order by 最後,增加 PK 列或 ROWID;
修改後的sql:在order的後面多加了一個u.user_id(主鍵)進行排序
select
*
from
( select
u.user_id user_id,
u.user_name user_name,
u.mobile1 mobile,
substr(u.id_no,
-4) id_no,
i.industry_name industry_name,
to_char(su.organ_type) organ_type,
su.organ_name group_name,
su.train_date train_date,
0 assign_status,
'未分配' assign_status_name
from
szfdc.szfdc_users su
join
sec_users u
on u.user_id = su.id
join
sec_user_group_rel ug
on u.user_id = ug.user_id
left join
t_industry i
on i.organ_type = su.organ_type
where
(
su.organ_type in (
512, 1024,2048
)
or su.organ_type is null
)
and ug.group_id = 10000000313
order by
su.train_date desc nulls last,u.user_id )
where
rownum <= 20;
總結:以後只要遇到排序列可能存在重複的情況下,都多加上一個主鍵列進行排序