[SQL]單位排序時,讓登入使用者的單位排在最前面

一般排序都是依某個欄位來排序,但是如果還要讓登入使用者的單位排在最前面要如何做呢?

前言

一般排序都是依某個欄位來排序,但是如果還要讓登入使用者的單位排在最前面要如何做呢?

研究

先準備資料(單位、單位人員)

 

--單位檔
CREATE TABLE DEPT_INFO(
DEPT_ID NVARCHAR(100)
,DEPT_NAME NVARCHAR(200)
)
 
--單位使用者資料檔
CREATE TABLE USER_INFO(
DEPT_ID NVARCHAR(100)
,USR_ID NVARCHAR(100)
,USR_NAME NVARCHAR(200)
)
 
--增加部門資料
INSERT INTO DEPT_INFO VALUES('DEPT_001', '部門001');
INSERT INTO DEPT_INFO VALUES('DEPT_003', '部門003');
INSERT INTO DEPT_INFO VALUES('DEPT_002', '部門002');
INSERT INTO DEPT_INFO VALUES('DEPT_004', '部門004');
INSERT INTO DEPT_INFO VALUES('DEPT_007', '部門007');
INSERT INTO DEPT_INFO VALUES('DEPT_005', '部門005');
 
--增加單位使用者資料
INSERT INTO USER_INFO VALUES('DEPT_007', 'USER_001', '使用者001');
INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_002', '使用者002');
INSERT INTO USER_INFO VALUES('DEPT_007', 'USER_003', '使用者003');
INSERT INTO USER_INFO VALUES('DEPT_002', 'USER_005', '使用者005');
INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_004', '使用者004');
INSERT INTO USER_INFO VALUES('DEPT_003', 'USER_006', '使用者006');
INSERT INTO USER_INFO VALUES('DEPT_005', 'USER_007', '使用者007');
INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_008', '使用者008');
INSERT INTO USER_INFO VALUES('DEPT_005', 'USER_009', '使用者009');
INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_010', '使用者010');
INSERT INTO USER_INFO VALUES('DEPT_003', 'USER_011', '使用者011');
INSERT INTO USER_INFO VALUES('DEPT_002', 'USER_012', '使用者012');
INSERT INTO USER_INFO VALUES('DEPT_007', 'USER_013', '使用者013');
INSERT INTO USER_INFO VALUES('DEPT_005', 'USER_014', '使用者014');
INSERT INTO USER_INFO VALUES('DEPT_001', 'USER_015', '使用者015');
INSERT INTO USER_INFO VALUES('DEPT_002', 'USER_016', '使用者016');

image

方法一,使用使用 UNION ALL

--以USER_011(DEPT_003)
--方法1:使用 UNION ALL
SELECT B.*
FROM DEPT_INFO A, USER_INFO B
WHERE A.DEPT_ID = B.DEPT_ID
AND A.DEPT_ID = (SELECT Z.DEPT_ID
    FROM USER_INFO Z
    WHERE Z.USR_ID = 'USER_011')
UNION ALL
SELECT B.*
FROM DEPT_INFO A, USER_INFO B
WHERE A.DEPT_ID = B.DEPT_ID
AND A.DEPT_ID NOT IN (SELECT Z.DEPT_ID
    FROM USER_INFO Z

 

image

但是以上的方式,會導致其他單位無法排序!

方法二,使用CASE WHEN 設定排序欄位

--以USER_011(DEPT_003)
--方法2:使用CASE WHEN 設定排序欄位
SELECT B.*
FROM DEPT_INFO A, USER_INFO B
WHERE A.DEPT_ID = B.DEPT_ID
ORDER BY CASE WHEN B.DEPT_ID = (SELECT Z.DEPT_ID
    FROM USER_INFO Z
    WHERE Z.USR_ID = 'USER_011') THEN 0
    ELSE 1
    END, B.DEPT_ID

image

以CASE WHEN來搞就比較OK了!

範例程式

DEP_USER.rar

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^