MS Access один-ко-многим запрос - PullRequest
0 голосов
/ 28 января 2019

Я работаю над базой данных типа сервиса.Клиенты могут иметь много типов оборудования и много вызовов для обслуживания.Я пытаюсь сделать запрос, который выбирает имя клиента, адрес и т. Д., Когда встречаются определенные параметры в зависимости от типа оборудования.

У клиента может быть до 5 различных типов оборудования.У некоторых есть только 1, у некоторых - все 5. Мой запрос пытается найти клиентов с установленным типом оборудования 3, но не с типом оборудования 5. Тип оборудования 3 также должен иметь дату обслуживания между полями даты в моей форме поиска.

Я рисую пробел, когда речь идет о написании этого запроса.Я смог запросить клиентов с типом оборудования 3 и конкретными датами обслуживания, но я не могу исключить клиентов, у которых также установлено оборудование 5, даже еслина них также установлено оборудование типа 3.

Это мой SQL:

SELECT 
tblCustomers.WCWF_ID, 
tblCustomers.CustBusiness, 
tblCustomers.CustLastName, 
tblCustomers.CustFirstName, 
tblCustomers.CustAddress, 
tblCustomers.CustCity, 
tblCustomers.CustST, 
tblCustomers.CustZip5, 
tblEquip.EquipResinDate, 
tblEquip.EquipType, 
tblCustomers.CustPostCard
FROM 
tblCustomers 
INNER JOIN 
tblEquip ON tblCustomers.WCWF_ID = tblEquip.WCWF_ID
WHERE 
(((tblEquip.EquipResinDate) Between [forms]![MailSearchSelect]![StartDate]   And [forms]![MailSearchSelect]![EndDate]) 
AND ((tblEquip.EquipType)=3 
AND (tblEquip.EquipType)<>5) 
AND ((tblCustomers.CustPostCard)=True));

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 28 января 2019

Проблема с вашим запросом заключается в том, что вы пытаетесь использовать одно JOIN для фильтрации клиентов с типом оборудования 3 и фильтрации клиентов с типом оборудования 5: вам придется разделить эту логику на две отдельные части.

Чтобы вытащить клиентов, у которых установлено оборудование типа 3, хорошо использовать JOIN (я просто переместил связанные условия из предложения WHERE в JOIN, для большей ясности).Также было бы возможно выразить это требование как условие WHERE EXISTS с коррелированным подзапросом.

Чтобы исключить клиентов, у которых установлен тип оборудования 5, вы можете:

  • использоватьусловие NOT EXISTS в предложении WHERE с коррелированным подзапросом (я выбрал эту опцию)
  • или используйте левое соединение с WHERE ... IS NULL.

Запрос:

SELECT
    c.WCWF_ID, 
    c.CustBusiness, 
    c.CustLastName, 
    c.CustFirstName, 
    c.CustAddress, 
    c.CustCity, 
    c.CustST, 
    c.CustZip5, 
    e.EquipResinDate, 
    c.EquipType, 
    c.CustPostCard
FROM
    tblCustomers AS c
    INNER JOIN tblEquip AS e
        ON e.WCWF_ID = c.WCWF_ID
        AND e.EquipType = 3
        AND e.EquipResinDate 
            BETWEEN [forms]![MailSearchSelect]![StartDate] 
            AND [forms]![MailSearchSelect]![EndDate]) 
WHERE
    c.CustPostCard = True
    AND NOT EXISTS (
        SELECT 1
        FROM tblEquip AS e2
        WHERE 
            e2.WCWF_ID = c.WCWF_ID
            AND e2.EquipType = 5
    )

PS: также неплохо давать псевдоним именам таблиц;это делает запрос более читабельным и позволяет избежать скрытых ошибок, вызванных конфликтами имен, когда в запросе упоминается несколько раз в одной и той же таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...