Hi @Josh ,
The problem definition is called a Relational Division.
Check it out here: divided-we-stand-the-sql-of-relational-division
SQL
USE tempdb;
GO
-- DDL and sample data population, start
DROP TABLE IF EXISTS dbo.EmployeeRole;
DROP TABLE IF EXISTS dbo.Roles;
CREATE TABLE dbo.EmployeeRole
(
employee_name CHAR(15) NOT NULL,
role CHAR(15) NOT NULL,
PRIMARY KEY (employee_name, [role])
);
INSERT INTO dbo.EmployeeRole (employee_name, role) VALUES
('Higgins', 'IT'),
('Higgins', 'Finance'),
('Jones' , 'IT'),
('Jones' , 'Finance'),
('Jones' , 'Science'),
('Smith' , 'IT'),
('Wilson' , 'Science'),
('Wilson' , 'Finance'),
('Helen' , 'Science');
CREATE TABLE dbo.Roles
(
role CHAR(15) NOT NULL PRIMARY KEY
);
INSERT INTO dbo.Roles (role) VALUES
('IT'),
('Finance');
-- DDL and sample data population, end
-- Relational Division with a Remainder
SELECT DISTINCT employee_name
FROM dbo.EmployeeRole AS PS1
WHERE EXISTS
(SELECT *
FROM dbo.Roles
WHERE NOT EXISTS
(SELECT *
FROM dbo.EmployeeRole AS PS2
WHERE (PS1.employee_name = PS2.employee_name)
AND (PS2.role = Roles.role)));
``Output
+---------------+
| employee_name |
+---------------+
| Helen |
| Smith |
| Wilson |
+---------------+