2011-05-25 111 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。這很重要,否則我會得到錯誤。