Доступ присоединиться к первой записи - PullRequest
0 голосов
/ 25 мая 2011

У меня есть две таблицы в базе данных 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?

Заранее спасибо Al

Ответы [ 4 ]

3 голосов
/ 25 мая 2011

Эта опция запускает подзапрос, чтобы найти минимальный 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 голос
/ 03 мая 2016

Это работает для меня.Может быть, это кому-то поможет:

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 (), но я не проверял это.

Также обязательно вызывайте Fields с оператором "AS", отличным от исходного поля.Я использовал frstFIELDNAME.Это важно, иначе я получил ошибки.

1 голос
/ 25 мая 2011

Создайте новый запрос, qryFirstGroupPerProduct:

SELECT intProduct, Min(intGroup) AS lowest_group
FROM tblProductGroups 
GROUP BY intProduct;

Затем присоедините qryFirstGroupPerProduct (вместо tblProductsGroups) к tblProducts.

Или вы можете сделать это как подзапрос вместо отдельного сохраненного запроса, если вы предпочитаете.

0 голосов
/ 25 мая 2011

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

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