#sql #ms-access #ms-access-2007
#sql #ms-access #ms-access-2007
Вопрос:
У меня есть две таблицы в базе данных Access, tblProducts и tblProductGroups.
Я пытаюсь выполнить запрос, который объединяет обе эти таблицы и возвращает одну запись для каждого продукта. Проблема в том, что текущий дизайн допускает, чтобы продукт был указан в таблице tblProductGroups более 1 — т. е. продукт может быть членом более чем одной группы (я этого не разрабатывал!)
Запрос такой:
select tblProducts.intID, tblProducts.strTitle, tblProductGroups.intGroup
from tblProducts
inner join tblProductGroups on tblProducts.intID = tblProductGroups.intProduct
where tblProductGroups.intGroup = 56
and tblProducts.blnActive
order by tblProducts.intSort asc, tblProducts.curPrice asc
На данный момент это возвращает такие результаты, как:
intID | strTitle | intGroup
1 | Product 1 | 1
1 | Product 1 | 2
2 | Product 2 | 1
2 | Product 2 | 2
В то время как я хочу, чтобы соединение основывалось только на первой соответствующей записи, чтобы возвращать:
intID | strTitle | intGroup
1 | Product 1 | 1
2 | Product 2 | 1
Возможно ли это в Access?
Заранее спасибо всем
Ответ №1:
Этот параметр запускает подзапрос, чтобы найти минимальное значение intGoup для каждого tblProducts.intID.
SELECT tblProducts.intID
, tblProducts.strTitle
, (SELECT TOP 1 intGroup
FROM tblProductGroups
WHERE intProduct=tblProducts.intID
ORDER BY intGroup ASC) AS intGroup
FROM tblProducts
WHERE tblProducts.blnActive
ORDER BY tblProducts.intSort ASC, tblProducts.curPrice ASC
Комментарии:
1. Привет — спасибо за ваш ответ. Хотя это не совсем то, что я ищу. Я ищу, чтобы оно возвращало несколько строк, но только на основе первого совпадения с таблицей tblProductGroups.
2. Ммм…. Вот что должен делать этот запрос: по одной строке для каждого продукта с его «первой» группой продуктов (с наименьшим идентификатором).
3. Привет — я попробовал ваш пример (возможно, после того, как он был отредактирован), и он сработал абсолютно идеально — большое вам спасибо, как раз то, что мне было нужно.
Ответ №2:
У меня это работает. Может быть, это кому-то поможет:
SELECT
a.Lagerort_ID,
FIRST(a.Regal) AS frstRegal,
FIRST(a.Fachboden) AS frstFachboden,
FIRST(a.xOffset) AS frstxOffset,
FIRST(a.yOffset) AS frstyOffset,
FIRST(a.xSize) AS frstxSize,
FIRST(a.ySize) AS frstySize,
FIRST(a.Platzgr) AS frstyPlatzgr,
FIRST(b.Artikel_ID) AS frstArtikel_ID,
FIRST(b.Menge) AS frstMenge,
FIRST(c.Breite) AS frstBreite,
FIRST(c.Tiefe) AS frstTiefe,
FIRST(a.Fachboden_ID) AS frstFachboden_ID,
FIRST(b.BewegungsDatum) AS frstBewegungsDatum,
FIRST(b.ErzeugungsDatum) AS frstErzeugungsDatum
FROM ((Lagerort AS a)
LEFT JOIN LO_zu_ART AS b ON a.Lagerort_ID = b.Lagerort_ID)
LEFT JOIN Regal AS c ON a.Regal = c.Regal
GROUP BY a.Lagerort_ID
ORDER BY FIRST(a.Regal), FIRST(a.Fachboden), FIRST(a.xOffset), FIRST(a.yOffset);
У меня есть неуникальные записи для Lagerort_ID в таблице LO_zu_ART. Моей целью было использовать только первую найденную запись из LO_zu_ART для сопоставления с Lagerort.
Хитрость заключается в том, чтобы использовать FIRST () для любого столбца, кроме сгруппированного. Это также может работать с MIN () или MAX (), но я это не тестировал.
Также убедитесь, что поля вызываются с помощью инструкции «AS», отличной от исходного поля. Я использовал frstFIELDNAME . Это важно, иначе я получал ошибки.
Ответ №3:
Создайте новый запрос, qryFirstGroupPerProduct:
SELECT intProduct, Min(intGroup) AS lowest_group
FROM tblProductGroups
GROUP BY intProduct;
Затем ПРИСОЕДИНИТЕ qryFirstGroupPerProduct (вместо tblProductsGroups) к tblProducts.
Или вы могли бы сделать это как подзапрос вместо отдельного сохраненного запроса, если предпочитаете.
Ответ №4:
Это не очень оптимально, но если вы вводите несколько тысяч записей, это сработает:
- Создайте запрос, который получает максимальное значение tblProducts.intID из одной таблицы, и назовите его qry_Temp.
- Создайте другой запрос и присоедините qry_temp к таблице, к которой вы пытаетесь присоединиться, и вы должны получить свои результаты.