Доступ к вложенному внутреннему соединению в правом соединении - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь вложить внутреннее соединение в доступе внутри правого соединения. Первый запрос на правое соединение:

SELECT * FROM ProjectMilestone AS a
RIGHT JOIN ProjectMilestone AS b ON a.PredecessorMilestone = 
b.ProjectMilestoneID

Где при объединении первый оператор выбора будет иметь d.MilestoneName

Второй запрос внутреннего соединения:

SELECT d.MilestoneName FROM ProjectMilestone AS c INNER JOIN Milestone AS d 
ON c.MilestoneID = d.MilestoneID

Что я прочитал с доступом, так это то, что существует проблема с выполнением внутреннего соединения после правого соединения, поэтому я не уверен, что делать.Любая помощь будет принята с благодарностью.Спасибо.

Пример данных:

ProjectMilestone Table
ProjectMilestoneID, MilestoneID, etc etc, PredecessorMilestone (which is linked to ProjectMilestoneID on a 0-1 to 1 cardinality)
79, 1 , , Null
80, 2, , 79
81, 3, , 80

Milestone Table
MilestoneID, MilestoneName
1, Handover
2, Deposit
3, Handover Panels

Итак, я получаю следующие результаты:

Null 
Handover 
Deposit

Итак, для второго результата (передача обслуживания): который в таблице ProjectMilestoneэто запись ProjectMilestoneID 80, PredecessorMilestone - 79, затем получить ProjectMilestoneID 79 с помощью правого соединения с другим экземпляром таблицы ProjectMilestone (поскольку он связан с той же таблицей), чтобы найти значение MilestoneID (1) из строки, в которой значение ProjectMilestoneID 79, затем найдите соответствующую запись MilestoneName в таблице Milestone для MilestoneID 1, который является передачей.

Надеюсь, это имеет больше смысла.

1 Ответ

0 голосов
/ 09 октября 2018

В общем, вы не смешиваете внутренние и внешние соединения таким образом.Вы начинаете с таблицы, строки которой вы хотите сохранить.Затем добавьте LEFT JOIN s для всех остальных таблиц.

Если вы хотите, чтобы имя этапа использовалось для первого этапа, вы можете сделать:

SELECT pm.*, pmp.*, m.MilestoneName
FROM (ProjectMilestone AS pm LEFT JOIN
      ProjectMilestone AS pmp
      ON pm.PredecessorMilestone = pmp.ProjectMilestoneID
     ) LEFT JOIN
     Milestone AS m
     ON pm.MilestoneID = m.MilestoneID;

Вы можете добавить еще LEFT JOIN, еслиВы хотите имена обоих этапов.

...