oracle(四)-order by 排序分頁重複解決

問題描述: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;

總結:以後只要遇到排序列可能存在重複的情況下,都多加上一個主鍵列進行排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章