的一個子集:SQL:選擇行其不同的值是另一個表的假設下表中不同的值
plan_role
id | plan_id | role_id
----+---------+---------
7 | 1 | 10
8 | 1 | 20
9 | 1 | 30
10 | 2 | 10
11 | 2 | 20
12 | 3 | 30
13 | 4 | 40
user_role
id | user_id | role_id
----+---------+---------
8 | 100 | 10
9 | 100 | 20
10 | 100 | 40
11 | 200 | 10
12 | 200 | 20
13 | 200 | 30
14 | 200 | 40
什麼是SQL查詢,將返回所有plan_ids這樣給定的user_id的一套role_ids的是一個超集plan_ids的role_id集合?
換句話說,我如何找到給定用戶的計劃,以便用戶至少與每個計劃共享所有角色。
例如,user_id
100應返回plan_id
第2,第4和user_id
200應該返回1,2,3,4,
爲了方便起見,這裏是我使用的設置:
CREATE TABLE plan_role(
id serial PRIMARY KEY,
plan_id integer NOT NULL,
role_id integer NOT NULL
);
CREATE TABLE user_role(
id serial PRIMARY KEY,
user_id integer NOT NULL,
role_id integer NOT NULL
);
INSERT INTO plan_role (plan_id, role_id) VALUES (1, 10);
INSERT INTO plan_role (plan_id, role_id) VALUES (1, 20);
INSERT INTO plan_role (plan_id, role_id) VALUES (1, 30);
INSERT INTO plan_role (plan_id, role_id) VALUES (2, 10);
INSERT INTO plan_role (plan_id, role_id) VALUES (2, 20);
INSERT INTO plan_role (plan_id, role_id) VALUES (3, 30);
INSERT INTO plan_role (plan_id, role_id) VALUES (4, 40);
INSERT INTO user_role (user_id, role_id) VALUES (100, 10);
INSERT INTO user_role (user_id, role_id) VALUES (100, 20);
INSERT INTO user_role (user_id, role_id) VALUES (100, 40);
INSERT INTO user_role (user_id, role_id) VALUES (200, 10);
INSERT INTO user_role (user_id, role_id) VALUES (200, 20);
INSERT INTO user_role (user_id, role_id) VALUES (200, 30);
INSERT INTO user_role (user_id, role_id) VALUES (200, 40);
我在原文中有點困惑 - 我已經更新了它。對於那個很抱歉!基本上,我需要所有的plan_id,以使得給定的user_id的role_id集合_is是plan_ids的role_id集合的超集。 – Tyson
該查詢返回user_id 100的plan_id 1,2和4.但是,plan_id 1具有用戶不具有的role_id 30。因此,計劃1的角色不是用戶角色的子集。 – Tyson
@Tyson查詢似乎現在正在工作。 –