2011-05-25 69 views
0

我在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 

这是可能的访问?提前 铝

回答

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 
+0

嗨 - 感谢您的回复。这不是我正在寻找的东西。我正在寻找它返回多行,但只基于与tblProductGroups表的第一次匹配。 – higgsy 2011-05-25 17:26:29

+1

嗯......这就是这个查询应该做的事情:每个产品的一行,以及它的“第一”(最低ID)产品组。 – RolandTumble 2011-05-25 18:42:38

+0

嗨 - 我试过你的例子(也许在它被编辑后),它的工作原理绝对完美 - 非常感谢你,正是我所需要的。 – higgsy 2011-05-27 07:52:56

0

这不是很优化,但如果你带来几千条记录这将工作:

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

创建一个新的查询,qryFirstGroupPerProduct:

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

再加入qryFirstGroupPerProduct(而不是tblProductsGroups)到tblProducts。

或者你可以做它作为一个子查询,而不是一个单独的保存查询,如果你愿意。

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。这很重要,否则我会得到错误。