2016-06-01 2 views
2

Это немного сложно описать, так голые со мной на этом. У меня 3 таблицы.Как вернуть результаты запроса, даже если результат соединения равен нулю в MS Access?

Один из них содержит анкеты, как описано ниже:

ID NM 
============== 
1 Profile A 
2 Profile B 

Второй содержит задания:

ID NM 
============== 
1 Assignment A 
2 Assignment B 

Моя третья содержит FID для обоих и позволяет определить приоритеты их следующим образом:

ID P_FID A_FID PRIORITY 
======================== 
1 1  2  1 
2 1  1  2 

Моя проблема заключается в заполнении третьей таблицы непрерывной формой, поэтому конечный пользователь имеет способность вводить приоритеты. В принципе, есть поле со списком, которое позволяет пользователю выбрать соответствующий профиль. Если в третьей таблице нет записей, она должна показать вам все назначения, чтобы вы могли вводить приоритеты. Если в этой таблице уже есть записи, они должны получить эти значения, чтобы вы могли обновлять приоритеты.

Следующий запрос работает отлично, пока третья таблица пуста. Как только пользователь вводит приоритеты и пытается переключиться на другой профиль, он не возвращает никаких записей, если это не выбранный профиль.

SELECT tblProfileForAssignments.PROFILE_FID, 
     tblAssignments.NM, 
     tblProfileForAssignments.PRIORITY 
FROM tblAssignments 
LEFT JOIN tblProfileForAssignments ON tblAssignments.ID = tblProfileForAssignments.ASSGNMNT_FID 
WHERE (tblProfileForAssignments.PROFILE_FID = Forms!frmProfileAssignments!cmboProfile) 
    OR (tblProfileForAssignments.PROFILE_FID IS NULL); 

Можно ли это сделать в одном запросе с использованием союза, я думаю, или я должен просто вернуться к VBA, чтобы понять это? Как я уже сказал, он отлично работает до тех пор, пока третья таблица пуста или они работают только с первым профилем, который они выбирают, кроме того, что он терпит неудачу. Имеет ли это смысл?

ответ

1

Превращение его в подзапрос может дать вам то, что вам нужно:

SELECT PRIORITIES.PROFILE_FID, tblAssignments.NM, 
PRIORITIES.PRIORITY 
FROM tblAssignments LEFT JOIN 
(SELECT ASSGNMNT_FID, PROFILE_FID, PRIORITY 
FROM tblProfileForAssignments 
WHERE PROFILE_FID = [Forms]![frmProfileAssignments]![cmboProfile]) PRIORITIES 
ON tblAssignments.ID = PRIORITIES.ASSGNMNT_FID 

Это должно вернуть все имена назначения вместе с любыми заданиями для указанного профиля. Запрос в вашем примере не будет отображать записи, если назначения для любого профиля существовали, а текущий профиль не выполнял назначений.

+0

Удивительный! Это работало как чемпион. – Munsterlander

Смежные вопросы