我已经编辑了这个问题,以使其更加简洁,如果您看到我的编辑历史记录,您会看到我的努力和“我尝试过的方法”,但是它添加了很多不必要的噪音并引起混乱,因此在这里是输入和输出的摘要:
People:
ID | FullName
--------------------
1 | Jimmy
2 | John
3 | Becky
PeopleJobRequirements:
ID | PersonId | Title
--------------------
1 | 1 | Some Requirement
2 | 1 | Another Requirement
3 | 2 | Some Requirement
4 | 3 | Another Requirement
输出:
FullName | RequirementTitle
---------------------------
Jimmy | Some Requirement
Jimmy | Another Requirement
John | Some Requirement
John | null
Becky | null
Becky | Another Requirement
每个人都有2条记录,因为那是表中有多少个不同的要求(基于“标题”的区别)。
假定没有第三张表-“ PeopleJobRequirements”对于每个人都是唯一的(一个人到许多需求),但是其中将有重复的Title(某些人具有相同的工作要求)。
对由最新更新引起的任何混乱表示由衷的歉意。
答案 0 :(得分:2)
CROSS JOIN
可获得每个人相等的记录,而LEFT JOIN
可获得匹配的记录。
以下查询应在您的情况下起作用
select p.Id, p.FullName,r.Title
FROM People p
cross join (select distinct title from PeopleJobRequirements ) pj
left join PeopleJobRequirements r on p.id=r.personid and pj.Title=r.Title
order by fullname
输出
+----+----------+---------------------+
| Id | FullName | Title |
+----+----------+---------------------+
| 3 | Becky | Another Requirement |
+----+----------+---------------------+
| 3 | Becky | NULL |
+----+----------+---------------------+
| 1 | Jimmy | Some Requirement |
+----+----------+---------------------+
| 1 | Jimmy | Another Requirement |
+----+----------+---------------------+
| 2 | John | NULL |
+----+----------+---------------------+
| 2 | John | Some Requirement |
+----+----------+---------------------+
答案 1 :(得分:1)
使用左联接,不需要任何子查询
select p.*,jr.*,jrr.*
from People p left join
PeopleJobRequirements jr on p.Id=jrPersonId
left join JobRoleRequirements jrr p.id=jrr.PersonId
答案 2 :(得分:0)
根据说明,People和PeopleJobRequirements表具有多对多关系(n到n)。 因此,首先,您将需要另一个表将它们与表关联。 首先执行此操作,然后完全加入将使其正确。