Я пытаюсь создать основу для списка продуктов в запросе MS Access. Основу впоследствии необходимо использовать в форме, в которой продукты визуализируются только с одним из многих изображений, связанных с каждым продуктом. Имя изображения рассчитывается с помощью поля выражения на основе идентификатора продукта и идентификатора цвета, который также является составным первичным ключом для таблицы.
The table name: Images
Field Name Datatype
ProductID Number
ColorID Number
ImageName Expression [ProductID] & "-" & [ColorID] & ".jpg"
Небольшой вывод из таблицы с более чем 62К записей:
Я пробовал использовать Distinct и Group By с функцией MIN Min, но безуспешно.
SELECT ProductID, ColorID, ImageName
FROM Images
GROUP BY ProductID, ColorID, ImageName
HAVING (((ColorID)=(SELECT MIN(ColorID) FROM Images)));
Что я ожидаю от результата запроса:
Спасибо, но не похоже, что это было решение по этой ссылке, и оно было решено в VBA, который не был представлен. Но я попробовал два предложения, но безрезультатно.
Кроме того, в результате нет уникальной комбинации двух значений, за исключением составного первичного ключа.
1 значение, 2 значения, n значений, концепция будет такой же. И никакого VBA не было. Но если ответ решает проблему, поздравляю. Однако остерегайтесь использования First и Last, которые могут привести к неожиданным результатам, поскольку записи не имеют внутреннего порядка.
Я не осознавал, что имя файла изображения было рассчитано на основе двух полей, поэтому да, предложенное решение для ссылки не совсем подходит для вашей ситуации.
Попробуй это:
SELECT A.ProductID , MIN(A.ColorID) AS ColorID , FIRST(A.ImageName) AS ImageName
FROM (SELECT ProductID FROM Images GROUP BY ProductID) AS B
INNER JOIN Images AS A
ON B.ProductID = A.ProductID
GROUP BY A.ProductID
ОБНОВЛЯТЬ:
Как упоминалось в июне 7, этот код может возвращать неверные результаты, если идентификаторы ColorID заказа отличаются от образцов данных. Пожалуйста, посмотрите правильный ответ до 7 июня.
Ух ты, сработало великолепно и на 100% соответствует тому, что я хотел. Большое спасибо
Будьте осторожны с First и Last, которые могут возвращать неожиданные результаты, поскольку записи не имеют внутреннего порядка.
@June7, ты абсолютно прав. Спасибо за подсказку. Подскажите пожалуйста, лучше удалить пост или оставить как есть.
Когда я сгенерировал имя ImageName в запросе, я смог получить нужный мне на данный момент результат, но с риском, конечно, что вычисленное имя изображения в таблице Images изменится в будущем. Вероятно, мне следовало использовать результат без вычисленного значения в подзапросе, но пока это хорошо.
SELECT Images.ProductID, Min(Images.ColorID) AS MinOfColorID, [ProductID] & "-" & [ColorID] & ".jpg" AS ImageName
FROM Images
GROUP BY Images.ProductID, [ProductID] & "-" & [ColorID] & ".jpg"
ORDER BY Images.ProductID;
Смотрите правильное решение Шахрама Алемзаде выше моего.
Почему вы считаете, что вычисления в запросе представляют риск? Если у вас есть вычисляемое поле в таблице, оно должно отражать тот же результат. Если вы программно сохраняете вычисленный результат в текстовом поле, это другая проблема — не делайте этого.
Это оказалось намного проще, чем я ожидал. Учитывать:
SELECT ProductID, Min(ColorID) AS CID, ProductID & "-" & Min(ColorID) & ".jpg" AS ImageName
FROM Images
GROUP BY ProductID;
Этот вопрос похож на: MSAccess — запрос на возврат набора результатов самых ранних строк с уникальной комбинацией двух столбцов. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.