访问第一条记录的加入

时间:2011-05-25 17:19:48

标签: 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中是否可以这样做?

提前致谢 人

4 个答案:

答案 0 :(得分:3)

此选项运行子查询以查找每个tblProducts.intID的最小intGoup。

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 :(得分:1)

创建一个新查询qryFirstGroupPerProduct:

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

然后将qryFirstGroupPerProduct(而不是tblProductsGroups)加入tblProducts。

如果您愿意,也可以将其作为子查询而不是单独保存的查询。

答案 2 :(得分:1)

这对我有用。也许这有助于某人:

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);

我在表LO_zu_ART上有Lagerort_ID的非唯一条目。我的目标是只使用LO_zu_ART中找到的第一个条目来匹配Lagerort。

诀窍是使用FIRST()一个任何列但是分组的列。这也适用于MIN()或MAX(),但我还没有测试过。

同时确保使用" AS"声明不同于原始字段。我用了frstFIELDNAME。这很重要,否则我就会出错。

答案 3 :(得分:0)

这不是最优的,但如果你带来几千条记录,这将有效:

  1. 创建一个查询,从一个表中获取最大的tblProducts.intID并将其命名为qry_Temp。
  2. 创建另一个查询并将qry_temp加入您尝试加入的表中,您应该得到结果。