简单SQL查询,如果找不到匹配项,则返回null

时间:2019-03-06 10:35:36

标签: sql sql-server sql-server-2008 left-join

编辑

我已经编辑了这个问题,以使其更加简洁,如果您看到我的编辑历史记录,您会看到我的努力和“我尝试过的方法”,但是它添加了很多不必要的噪音并引起混乱,因此在这里是输入和输出的摘要:

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(某些人具有相同的工作要求)。

对由最新更新引起的任何混乱表示由衷的歉意。

3 个答案:

答案 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

Online Demo

输出

+----+----------+---------------------+
| 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)。 因此,首先,您将需要另一个表将它们与表关联。 首先执行此操作,然后完全加入将使其正确。