SQL-запрос (Показать все «x», где «x» отсутствует в таблице «2» для поля «y» и имеет флаг «z») - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно вернуть все «контакты», которые не отображаются в таблице «делегат» для «имени события», но имеют флажки в таблице «контакты», которые пользователь может выбрать для поиска.

Я знаю, что запрос можно разбить на 2 части.

  1. Они уже присутствуют на этом мероприятии (отображается ли их электронная почта в таблице «делегатов» с полем Delegates.event, совпадающим с «событием» в пользовательской форме)
WHERE (
  d.Event <> [Forms]![usf_FindCampaignContacts]![FCC_EventName]
  1. Соответствуют ли они критериям (есть ли у них флаг HR в таблице «контакты»)
  AND (c.[HR-DEL]   = [Forms]![usf_FindCampaignContacts]![FCC_HRD]   OR IsNull([Forms]![usf_FindCampaignContacts]![FCC_HRD]));

Основываясь на двух вещах, которые требуются для выполнения запроса, я написал следующий код ...

SELECT 
c.[First Name], c.[Last Name], c.Email, d.Event, c.Suppress, c.[HR-DEL]

FROM tbl_Contacts AS c LEFT JOIN tbl_Delegates AS d ON c.Email = d.Email

WHERE (
  d.Event <> [Forms]![usf_FindCampaignContacts]![FCC_EventName]
  And 
  c.Suppress = False
) 
  AND (c.[HR-DEL]   = [Forms]![usf_FindCampaignContacts]![FCC_HRD]   OR IsNull([Forms]![usf_FindCampaignContacts]![FCC_HRD]));

[FCC_HRD] относится к выбранному пользователем вводу в форме, я пытался использовать <> для удаления совпадающих записей, но я чувствую, что это ошибка компиляции, поэтому я изменил их на операторы и / или операторы и эту часть сейчас возвращает результаты с соответствующими флагами (Успех)

Другая проблема при попытке сделать это таким образом, даже если это сработает, удалит любого, кто был указан в таблице делегатов / спонсоров. Именно поэтому я добавил оператор <> для события, так как ему нужно только удалить их из списка для именованного события. Опять же, это прекрасно работает (Успех)

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

Вот отношения запрос / таблица

Вот пользовательская форма (Это не окончательный дизайн)

Ниже приведены 3 таблицы, которые используются в запросе (2 прямые, 1 связанная) Контакты (в)

+----+------------+---------------+-------------------------+--------+----------+
| ID | First Name |   Last Name   |          Email          | HR-DEL | Suppress |
+----+------------+---------------+-------------------------+--------+----------+
|  1 | A          | Platt         | a.platt@fake.com        | TRUE   | TRUE     |
|  2 | D          | Farr          | d.farr@fake.com         | TRUE   | FALSE    |
|  3 | Y          | Helle         | y.helle@fake.com        | TRUE   | FALSE    |
|  4 | S          | Oliphant      | soliphant@fake.com      | TRUE   | FALSE    |
|  5 | J          | Bedell-Pearce | jbedell-pearce@fake.com | TRUE   | FALSE    |
|  6 | J          | Walker        | j.walker@fake.com       | FALSE  | FALSE    |
|  7 | S          | Rug           | s.rug@fake.com          | FALSE  | FALSE    |
|  8 | D          | Brown         | d.brown@fake.com        | FALSE  | FALSE    |
|  9 | R          | Cooper        | r.cooper@fake.com       | TRUE   | FALSE    |
| 10 | M          | Morrall       | m.morrall@fake.com      | TRUE   | FALSE    |
+----+------------+---------------+-------------------------+--------+----------+

Делегаты (д)

+----+-------------------------+-------+
| ID |          Email          | Event |
+----+-------------------------+-------+
|  1 | a.platt@fake.com        |     2 |
|  2 | d.farr@fake.com         |     1 |
|  3 | y.helle@fake.com        |     4 |
|  4 | soliphant@fake.com      |     3 |
|  6 | jbedell-pearce@fake.com |     2 |
+----+-------------------------+-------+

События (не прямые, но используемые для проверки раскрывающегося имени события в форме пользователя и номера события в делегатах)

+----+------------+
| ID | Event Name |
+----+------------+
|  1 | Test 1     |
|  2 | Test 2     |
|  3 | Test 3     |
|  4 | Test 4     |
+----+------------+

На основании выбора формы и данных этого примера мне нужно вернуть следующее:

Все контакты, помеченные как «HR» ИСТИНА, не подавленные или идущие на событие с именем «test 2» (должно быть 5 - я всегда возвращаю имена «делегатов», не посещающих только событие = 3)

Окончательные результаты должны быть:

+----+------------+-----------+--------------------+--------+----------+
| ID | First Name | Last Name |       Email        | HR-DEL | Suppress |
+----+------------+-----------+--------------------+--------+----------+
|  2 | D          | Farr      | d.farr@fake.com    | TRUE   | FALSE    |
|  3 | Y          | Helle     | y.helle@fake.com   | TRUE   | FALSE    |
|  4 | S          | Oliphant  | soliphant@fake.com | TRUE   | FALSE    |
|  9 | R          | Cooper    | r.cooper@fake.com  | TRUE   | FALSE    |
| 10 | M          | Morrall   | m.morrall@fake.com | TRUE   | FALSE    |
+----+------------+-----------+--------------------+--------+----------+

В данный момент он, похоже, извлекает результаты из неправильной таблицы (не c). Я попытался изменить тип соединения OUTER, но он вернулся с синтаксической ошибкой FROM.

1 Ответ

0 голосов
/ 05 апреля 2019

Если я правильно понимаю, в основном вы хотите сделать это:

SELECT A.foo
FROM A 
  LEFT JOIN B 
    ON A.bar = B.bar
WHERE
  <complex condition, partly involving B>

Это не может работать.Включив B в глобальное условие WHERE, вы превращаете ЛЕВОЕ СОЕДИНЕНИЕ в ВНУТРЕННЕЕ СОЕДИНЕНИЕ, и поэтому вы всегда будете получать только те записи, которые совпадают между A и B.

Вы можете переместить фильтр на B вУсловие JOIN:

SELECT A.foo
FROM A 
  LEFT JOIN B 
    ON (A.bar = B.bar)
    AND (B.bamboozle = 42)
WHERE
  A.columns = things

или LEFT JOIN отфильтрованный подзапрос:

SELECT A.foo
FROM A 
  LEFT JOIN 
    (SELECT bar, columns FROM B 
     WHERE B.bamboozle = 42) AS B1
    ON A.bar = B1.bar
WHERE
  A.columns = things

Таким образом, в вашем запросе это часть bamboozle , которую вам нужно будет переместить:

d.Event <> [Forms]![usf_FindCampaignContacts]![FCC_EventName]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...