Вы можете использовать запрос, чтобы преобразовать вашу существующую таблицу в «виртуальную таблицу», с которой, мне кажется, будет проще работать. Сохраните этот оператор SQL как qryHobbiesUnion.
SELECT [name] AS person, hobby1 AS hobby
FROM tblhobby
WHERE (((hobby1) Is Not Null))
UNION
SELECT [name], hobby2
FROM tblhobby
WHERE (((hobby2) Is Not Null))
UNION
SELECT [name], hobby3
FROM tblhobby
WHERE (((hobby3) Is Not Null));
Я заключил «имя» в квадратные скобки, потому что это зарезервированное слово . И я использовал псевдоним [name] как лицо, чтобы избежать проблем с квадратными скобками при использовании qryHobbiesUnion в подзапросе позже.
Я предполагал, что любые "пустые" значения для хобби будут нулевыми. Если пробелы также могут быть пустыми строками (""), измените предложения WHERE на такой шаблон:
WHERE Len(hobby1 & "") > 0
После того, как вы определите, какая версия предложения WHERE возвращает правильные строки, сохраните запрос и используйте его в другом запросе.
SELECT sub.person
FROM
[SELECT qh.person, qh.hobby, ah.available_hobby
FROM
qryHobbiesUnion AS qh
LEFT JOIN tblavailable_hobby AS ah
ON qh.hobby = ah.available_hobby
]. AS sub
GROUP BY sub.person
HAVING (((Count(sub.hobby))=Count([sub].[available_hobby])));
Используя ваш второй набор образцов данных, этот запрос возвращает имена 3 человек, которых вы хотели: amy; Бреда; и крис.
Если бы tblhobby содержал строку для человека с пустыми полями хобби, этот запрос не включал бы имя этого человека. Это имеет смысл для меня, потому что, похоже, ваше намерение состоит в том, чтобы определить людей, чей выбор хобби совпадает в tblavailable_hobby. Так что у человека без выбора хобби нет совпадений. Если вы хотите другое поведение, это, вероятно, станет еще хуже. : -)