Запрос доступа и VBA SQL возвращает разные данные для «Имея» - PullRequest
0 голосов
/ 21 июня 2020

У меня есть запрос со следующим SQL в редакторе запросов:

SELECT tbl_PN_Import.PN, Last(tbl_PN_Import.Master_PN) AS Master_PN
FROM tbl_PN_Import
GROUP BY tbl_PN_Import.PN
Having (((Last(tbl_PN_Import.Master_PN)) Is Not Null))
ORDER BY tbl_PN_Import.PN;`

Он возвращает более 10 000 записей в редакторе запросов.

Ниже приведен список примеров записей. Наша база данных содержит основные номера деталей, которые имеют отношение «один ко многим» с альтернативными номерами деталей. Поле PN содержит все номера деталей, как основные, так и альтернативные. Если PN является главным PN, для него нет записи в поле Master_PN. Если PN является альтернативным номером детали, его Master_PN находится в поле Master_PN.

PN                 Master_PN 
NAS1149FN432P 
AN960-4            NAS1149FN432P 
AD64ALS 
SSPQ-4-3 
SSPQ-04-03         SSPQ-4-3

Когда я запускаю запрос в VBA с использованием строковой переменной SQL и .OpenRecordSet, он возвращает только первую запись . Когда я удаляю Having...., он возвращает ожидаемые 70 000+ записей.

У меня есть другие запросы, в которых нет команды Having..., которая нормально работает.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

LAST не определено в несортированном наборе результатов, что означает, что подойдет любая строка. Используйте подзапрос, чтобы обеспечить соблюдение указанного порядка c, или вообще избегайте использования LAST.

Примером подзапроса может быть:

SELECT PN, Last(Master_PN) AS Master_PN
FROM (SELECT * FROM tbl_PN_Import ORDER BY Some_ID_field)
GROUP BY PN
Having Last(Master_PN) Is Not Null
ORDER BY tbl_PN_Import.PN;

Если у вас нет Поле идентификатора или что-то еще, что вы можете заказать, вы не можете ожидать, что LAST даст согласованные результаты.

1 голос
/ 21 июня 2020

Попробуйте просто отфильтровать Null значения:

SELECT tbl_PN_Import.PN, Last(tbl_PN_Import.Master_PN) AS Master_PN
FROM tbl_PN_Import
WHERE tbl_PN_Import.Master_PN Is Not Null
GROUP BY tbl_PN_Import.PN
ORDER BY tbl_PN_Import.PN

или, как Last , просто возвращает «значение»:

SELECT tbl_PN_Import.PN, Max(tbl_PN_Import.Master_PN) AS Master_PN
FROM tbl_PN_Import
WHERE tbl_PN_Import.Master_PN Is Not Null
GROUP BY tbl_PN_Import.PN
ORDER BY tbl_PN_Import.PN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...