Given the following tables:
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
What is an SQL query that will return all plan_ids objects, so this set of users_users is a superset of the role_ids set for plan_ids?
In other words, how do I find plans for a given user, so that the user shares at least all the roles with each plan.
For example, user_id100 should return plan_id2, 4, and user_id200 should return 1, 2, 3, 4.
For convenience, the setting I use here is used:
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);