Query中的LEFT JOIN返回的记录多于预期

时间:2017-08-26 22:26:01

标签: sql ms-access

我正在进行MS ACCESS查询,该查询应从一个主表(由FROM指定)中提取所有可用数据,然后通过LEFT JOIN连接另外三个表。我的问题是,由于一对多关系,查询返回的记录更多。

有什么办法可以在主表中每行只返回一条记录吗?任何帮助是极大的赞赏!!谢谢!

    SELECT tbl_Item_PO.Item, 
    tbl_ItemSKUType.SKU, 
    tbl_Item_PO.[EX-FACTORY DATE], 
    tbl_Item_PO.[QTY PER SHIPMENT],
    IIf(tbl_Item_PO.Item=Posted_Inv_Tran.Item And tbl_Item_PO.Whse=Posted_Inv_Tran.Whse And tbl_Item_PO.[ITR#]=Posted_Inv_Tran.[TRN Number],0,tbl_Item_PO.[QTY PER SHIPMENT]) AS QTY, 
    tbl_Item_PO.WHSE, tbl_WhseRegion.Region
    FROM ((tbl_Item_PO 
    LEFT JOIN tbl_ItemSKUType ON tbl_Item_PO.item = tbl_ItemSKUType.Item) 
    LEFT JOIN tbl_WhseRegion ON tbl_Item_PO.WHSE = tbl_WhseRegion.Whse) 
    LEFT JOIN Posted_Inv_Tran ON (tbl_Item_PO.[ITR#] = Posted_Inv_Tran.[TRN Number]) AND (tbl_Item_PO.Whse = Posted_Inv_Tran.Whse) AND (tbl_Item_PO.Item = Posted_Inv_Tran.Item);

我也尝试在join语句中创建只返回一条记录的子查询但是我无法使其工作:

    SELECT po.Item, 
    ist.SKU, 
    po.[EX-FACTORY DATE], 
    po.[QTY PER SHIPMENT],
    IIf(po.Item=itr.Item And po.Whse=itr.Whse And po.[ITR#]=itr.[TRN Number],0,po.[QTY PER SHIPMENT]) AS QTY, 
    po.WHSE, 
    wh.Region
    FROM ((tbl_Item_PO po
    LEFT JOIN (select top 1 * from tbl_ItemSKUType
             RIGHT JOIN tbl_Item_PO on tbl_ItemSKUType.Item = tbl_Item_PO.item
             WHERE tbl_Item_PO.Item = tbl_ItemSKUType.Item) 
             ist ON po.item = ist.Item)
    LEFT JOIN (select top 1 * from tbl_WhseRegion
             RIGHT JOIN tbl_Item_PO on tbl_WhseRegion.Whse = tbl_Item_PO.Whse
             WHERE tbl_Item_PO.whse = tbl_WhseRegion.Whse) 
             wh ON po.Whse = wh.Whse)
    LEFT JOIN (select top 1 * from Posted_Inv_Tran
            RIGHT JOIN tbl_Item_PO on Posted_Inv_Tran.[TRN Number] = tbl_Item_PO.[ITR#] AND Posted_Inv_Tran.Whse = tbl_Item_PO.Whse AND Posted_Inv_Tran.Item = tbl_Item_PO.Item
            WHERE (tbl_Item_PO.[ITR#] = Posted_Inv_Tran.[TRN Number]) AND (tbl_Item_PO.Whse = Posted_Inv_Tran.Whse) AND (tbl_Item_PO.Item = Posted_Inv_Tran.Item)) 
            it ON (po.[ITR#] = it.[TRN Number]) AND (po.Whse = it.Whse) AND (po.Item = it.Item);

1 个答案:

答案 0 :(得分:2)

您可以使用group by子句实现此目的。确保列出该子句中标识一行的所有字段,并且select子句中的所有其他表达式/字段都与某些聚合函数聚合在一起,如Min()

注意:您的IIf条件不需要检查所有这些字段,只需一个就足够了:当一个匹配时,所有字段都匹配:

SELECT  tbl_Item_PO.Item, 
        Min(tbl_ItemSKUType.SKU) AS SKU, 
        tbl_Item_PO.[EX-FACTORY DATE], 
        tbl_Item_PO.[QTY PER SHIPMENT],
        Min(IIf(tbl_Item_PO.Item=Posted_Inv_Tran.Item, 0,  
                                  tbl_Item_PO.[QTY PER SHIPMENT])) AS QTY, 
        tbl_Item_PO.WHSE,
        Min(tbl_WhseRegion.Region) AS Region
FROM    ((tbl_Item_PO 
LEFT JOIN tbl_ItemSKUType 
        ON tbl_Item_PO.item = tbl_ItemSKUType.Item) 
LEFT JOIN tbl_WhseRegion 
        ON tbl_Item_PO.WHSE = tbl_WhseRegion.Whse) 
LEFT JOIN Posted_Inv_Tran 
        ON (tbl_Item_PO.[ITR#] = Posted_Inv_Tran.[TRN Number]) 
        AND (tbl_Item_PO.Whse = Posted_Inv_Tran.Whse) 
        AND (tbl_Item_PO.Item = Posted_Inv_Tran.Item)
GROUP BY tbl_Item_PO.Item, 
        tbl_Item_PO.[EX-FACTORY DATE], 
        tbl_Item_PO.[QTY PER SHIPMENT],
        tbl_Item_PO.WHSE;