我有五個表:如何正確構造這個sql查詢?
用戶
user_id | name
--------------------
0 | Mark
1 | Jen
2 | Mbali
3 | Mbabani
4 | Fang Zhao
角色
role_id | name
--------------------
3 | Employee
4 | Customer Asia
5 | Customer Africa
User_Role_Assoc
role_id | user_id
--------------------
3 | 0
3 | 1
3 | 2
5 | 3
4 | 4
個
Role_Reps
role_id | user_id
--------------------
4 | 0
4 | 1
請求
req_id | user_id
--------------------
8 | 3
9 | 3
10 | 4
11 | 4
馬克,仁和姆巴利是一個虛構的公司的所有員工(ROLE_ID = 3)。另外兩名用戶Mbabani和Fang Zhao是創建請求的客戶。
該查詢應該能夠看到req_id 8和9是由屬於Customer分配代表(Role_Reps)的Customer Africa角色(通過User_Role_Assoc)的用戶(Mbabani [3])請求的。
查詢應該能夠看到req_id 10和11是由屬於Customer Asia角色(通過User_Role_Assoc)擁有代表的用戶(Fang Zhao [4])請求的。
所有員工應該能夠看到所有請求。除非在Role_Reps表中有角色代表被分配給該角色。如果有任何代表,在這種情況下,馬克和仁,他們是唯一允許看到請求。如果在Role_Reps表中沒有定義任何代表,那麼每個人都應該能夠看到這些請求。
所以我需要一個查詢:
如果我傳遞一個userid=2
(姆巴利)我應該得到以下結果:
req_id | user_id
--------------------
10 | 4
11 | 4
如果我通過在userid=0
或userid=1
(馬克或仁)我應該得到以下結果:
req_id | user_id
--------------------
8 | 3
9 | 3
10 | 4
11 | 4
我希望我已經說清楚了。
UPDATE
這裏是的DDL生成與數據表:
DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user (
userid integer PRIMARY KEY,
name varchar(20)
);
GRANT ALL PRIVILEGES ON t_user TO PUBLIC;
INSERT INTO t_user (userid, name) VALUES (0,'Mark');
INSERT INTO t_user (userid, name) VALUES (1,'Jen');
INSERT INTO t_user (userid, name) VALUES (2,'Mbali');
INSERT INTO t_user (userid, name) VALUES (3,'Mbabani');
INSERT INTO t_user (userid, name) VALUES (4,'Fang Zhao');
DROP TABLE IF EXISTS t_role;
CREATE TABLE t_role (
roleid integer PRIMARY KEY,
name varchar(20)
);
GRANT ALL PRIVILEGES ON t_role TO PUBLIC;
INSERT INTO t_role (roleid, name) VALUES (3,'Employee');
INSERT INTO t_role (roleid, name) VALUES (4,'Customer Asia');
INSERT INTO t_role (roleid, name) VALUES (5,'Customer Africa');
DROP TABLE IF EXISTS t_user_role_assoc;
CREATE TABLE t_user_role_assoc (
roleid integer,
userid integer,
primary key(roleid, userid)
);
GRANT ALL PRIVILEGES ON t_user_role_assoc TO PUBLIC;
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (3,0);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (3,1);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (3,2);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (5,3);
INSERT INTO t_user_role_assoc (roleid, userid) VALUES (4,4);
DROP TABLE IF EXISTS t_role_reps;
CREATE TABLE t_role_reps (
roleid integer,
userid integer,
primary key(roleid, userid)
);
GRANT ALL PRIVILEGES ON t_role_reps TO PUBLIC;
INSERT INTO t_role_reps (roleid, userid) VALUES (4,0);
INSERT INTO t_role_reps (roleid, userid) VALUES (4,1);
DROP TABLE IF EXISTS t_request;
CREATE TABLE t_request (
req_id integer PRIMARY KEY,
userid integer
);
GRANT ALL PRIVILEGES ON t_request TO PUBLIC;
INSERT INTO t_request (req_id, userid) VALUES (8,3);
INSERT INTO t_request (req_id, userid) VALUES (9,3);
INSERT INTO t_request (req_id, userid) VALUES (10,4);
INSERT INTO t_request (req_id, userid) VALUES (11,4);
是的,睡了之後我意識到我會以錯誤的方式去做。 – capdragon 2012-02-03 14:06:30