Соединение доступа к первой записи

#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:

Это не очень оптимально, но если вы вводите несколько тысяч записей, это сработает:

  1. Создайте запрос, который получает максимальное значение tblProducts.intID из одной таблицы, и назовите его qry_Temp.
  2. Создайте другой запрос и присоедините qry_temp к таблице, к которой вы пытаетесь присоединиться, и вы должны получить свои результаты.