私の理解では、すべてのスキルをすべてのユーザーに配布したいと考えています。これが、以下のクエリにデカルト積を生成するサブクエリがある理由です。積の結果はテーブルtblEmployee
と再び結合tblSkill
され、それぞれの名前を取得できるようになります。
そして最後の部分はLEFT JOIN
、ユーザーに対する特定のスキルが table に存在するかどうかを確認するためのものtblEmployeeSkill
です。結果が の場合NULL
、ユーザーがまだそのスキルを持っていないことを意味します。
SELECT y.name EmployeeName,
z.name SkillName,
CASE WHEN xx.skillID IS NULL
THEN 'NO'
ELSE 'YES'
END status
FROM
(
SELECT a.employeeID, b.skillID
FROM tblEmployee a
CROSS JOIN tblSkill b
) x
INNER JOIN tblEmployee y
ON x.employeeID = y.employeeID
INNER JOIN tblSkill z
ON x.skillID = z.skillID
LEFT JOIN tblEmployeeSkill xx
ON x.employeeID = xx.employeeID AND
x.skillID = xx.skillID
-- WHERE x.employeeId = 1 -- uncomment this if you
-- want to select only one user