Простой SQL-запрос для возврата нуля, если не найдено совпадений - PullRequest
2 голосов
/ 06 марта 2019

EDIT

Я отредактировал этот вопрос, чтобы сделать его немного более кратким, если вы увидите мою историю редактирования, вы увидите мои усилия и «то, что я пытался», но это добавило много ненужного шума и вызвало путаницу, поэтому здесь Сводка ввода и вывода:

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 уникален для каждого человека (один человек соответствует множеству требований), но там будут дубликаты заголовков (у некоторых людей одинаковые требования к работе).

Приносим искренние извинения за путаницу, вызванную последними обновлениями.

Ответы [ 3 ]

2 голосов
/ 06 марта 2019

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 голос
/ 06 марта 2019

использовать левое соединение, никакой подзапрос не требуется

select p.*,jr.*,jrr.* 
from People p left join
PeopleJobRequirements jr on p.Id=jrPersonId
left join JobRoleRequirements jrr p.id=jrr.PersonId
0 голосов
/ 06 марта 2019

Согласно объяснению, таблицы People и PeopleJobRequirements имеют отношение "многие ко многим" (от n до n).поэтому прежде всего вам понадобится еще одна таблица, чтобы связать их с таблицей.сначала сделайте это, а затем полное соединение сделает все правильно.

...