MS Access Выбрать запрос. показать либо совпадение, либо не совпадение - PullRequest
0 голосов
/ 26 октября 2019

Я собираю запрос на выборку в конструкторе запросов.

У меня есть две таблицы, объединенные по идентификатору клиента, одна таблица данных и одна справочная таблица. Запрос на выборку отобразит точки данных и некоторые данные из справочной таблицы в зависимости от того, какие данные присутствуют. Например:

Data table
Customer ID    Batch ID    Order Number    Address    Warehouse
1234           1111        6546            place1     Ware1     
1234           2222        6547            place1     Ware2 
1235           3333        6548            place2     Ware3 
1236           4444        6549            place2     Ware4 
1237           5555        6550            place2     Ware5 
1238           6666        6551            place2     Ware6

Reference table
Customer ID    CustomerName   Warehouse   Account
1234           Cust1                      151515 
1234           Cust1          Ware2       151516 
1235           Cust2                      454545 
1236           Cust3                      464646 
1237           Cust4                      474747 
1238           Cust5                      484848

У меня есть ограничение: у меня нет доступа к полному списку всех различных складов клиентов для заполнения справочной таблицы, но поскольку большинство клиентов используют одну учетную запись для всех своих складов,не очень важно, чтобы они были заполнены. Однако есть один клиент, который имеет отдельную учетную запись для конкретного склада. Я предпочел бы не иметь решение, которое обслуживает одного клиента, а скорее может работать с любым клиентом, который появится в будущем, у которого есть отдельная отдельная учетная запись.

Поле, которое я собираюсь заполнить, будет отображать учетную запись, если склад соответствует или не соответствует (потому что он пустой). Я ломал свой мозг. Я не уверен, что есть решение для этого, но я решил представить его сообществу.

РЕДАКТИРОВАТЬ
Вот пример выходных данных, которые я ищу, еслиВы даете таблицу данных и запускаете запрос. Я также обновил столбец учетной записи фактическими значениями, чтобы он был менее запутанным

Query Results
CustomerName    Order Number    Account    Address
Cust1           6546            151515     Place1
Cust1           6547            161616     Place1
Cust2           6548            454545     Place2
Cust3           6549            464646     Place3
Cust4           6550            474747     Place4
Cust5           6551            484848     Place5

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Это довольно просто, пока вы не устраните пустые совпадения, когда есть соответствующий склад. Вот один из способов использования подзапроса для устранения совпадений со значением NULL для хранилища:

SELECT tblData.[Customer ID], tblData.[Batch ID], tblData.[Order Number], tblData.Address, tblData.Warehouse, tblRef.Account
FROM tblData LEFT JOIN tblRef ON tblData.[Customer ID]=tblRef.[Customer ID]
WHERE (tblData.Warehouse=tblRef.[Warehouse] AND tblRef.Warehouse Is Not Null)
   OR (tblData.Warehouse Not In (SELECT tblRef.Warehouse FROM tblRef WHERE tblRef.Warehouse Is Not Null AND tblRef.[Customer ID] = tblData.[Customer ID]) AND tblRef.Warehouse Is Null);

Таким образом, выполняется левое объединение только для [Customer ID], включая записи, где хранилище соответствует и не равно NULL, а такжевключить записи, которые не имеют соответствующего хранилища и, кроме того, не имеют соответствующего хранилища, существующего для данного [идентификатора клиента] (они перечислены в подзапросе для каждого [идентификатора клиента])

Результат:

Customer ID    Batch ID    Order Number    Address    Warehouse    Account
1234           1111        6546            place1     Ware1        Account1     
1234           2222        6547            place1     Ware2        Account2 
1235           3333        6548            place2     Ware3        Account1 
1236           4444        6549            place2     Ware4        Account1 
1237           5555        6550            place2     Ware5        Account1 
1238           6666        6551            place2     Ware6        Account1
0 голосов
/ 26 октября 2019

Функция агрегирования домена DLookup может получить то, что вы хотите. Рассмотрим:

SELECT Data.CustomerID, Data.BatchID, Data.OrderNumber, Data.Address, Data.Warehouse, 
Nz(DLookUp("Account","Reference","CustomerID=" & [CustomerID] & " AND Warehouse='" & [Warehouse] & "'"), 
   DLookup("Account","Reference","CustomerID=" & [CustomerID] & " AND Nz([Warehouse])<>'" & [Warehouse] & "'")) AS Acct
FROM Data;
...