許可權控制下的SQL寫法

leniz發表於2007-08-24
1.  物料類別表(樹狀關係 起點 為 parent_id =  0 )
CREATE TABLE  T_MATERIAL_TYPE (
ID NUMBER(10) PRIMARY KEY,
MT_CODE VARCHAR2(20),
MT_NAME VARCHAR2(20),
PARENT_ID NUMBER(10)
)
INSERT INTO T_MATERIAL_TYPE VALUES(1,'A','產成品',0);
INSERT INTO T_MATERIAL_TYPE VALUES(2,'B','半成品',0);
INSERT INTO T_MATERIAL_TYPE VALUES(3,'C','原材料',0);
INSERT INTO T_MATERIAL_TYPE VALUES(4,'A','燈盤類',1);

2.物料表
CREATE TABLE  T_MATERIAL_DETAIL(
ID NUMBER(10) PRIMARY KEY,
MD_CODE VARCHAR2(20),
MD_NAME VARCHAR2(20),
MT_ID NUMBER(10)
)

INSERT INTO T_MATERIAL_DETAIL  
VALUES(1,'AA000001','1#燈盤',4);


3. 使用者可操作物料類別 表
CREATE TABLE T_SYS_OPER_MATERIAL_TYPE
(   ID NUMBER(10) PRIMARY KEY,
    O_ID  NUMBER(10)   , --------使用者id
   MT_ID  NUMBER(10)    --  物料類別id
)

使用者表就不理它了.
加一條記錄進去
INSERT INTO T_SYS_OPER_MATERIAL_TYPE
VALUES(1,1,4);

現在使用者 要過濾物料, 這個語句就不是很好寫.

我的寫法是 先 查詢 物料是否存在, 然後 ,判斷 存在的物料的類別是否在使用者的可操作物料類別中.

SELECT ID, G_CODE ACODE, G_NAME ANAME
FROM T_MATERIAL_DETAIL A
WHERE (A.G_CODE LIKE '%條件%' OR A.G_NAME LIKE '%條件%')
AND EXISTS (SELECT 1
FROM (
SELECT ID   FROM T_MATERIAL_CODING_METHOD MC
CONNECT BY PRIOR ID = PARENT_ID
START WITH EXISTS
(SELECT 1
FROM T_SYS_OPERATOR_MATERIAL OM
WHERE OM.O_ID = 1
AND MC.ID = OM.M_ID)) T1
WHERE T1.ID = A.CM_ID)



好像走的都是全表掃描 . 不知道 大家怎麼處理 這種情況.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/554557/viewspace-531759/,如需轉載,請註明出處,否則將追究法律責任。

相關文章