我在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中是否可以这样做?
提前致谢 人
答案 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)
这不是最优的,但如果你带来几千条记录,这将有效: