获取从一对多关系 Firebird 加入的最后记录

Getting last record on join from one to many relationship Firebird

我目前正在开发一个 Firebird 数据库,其中产品与产品的成本 table 是一对多的。我需要在产品列表脚本中包含最新成本(最高 ID)。

我不确定如何在一对多关系上执行此操作。

select SPLU.SHOPPRODUCTSPLUID,SPLU.plu, SPLU.description, SPLU.SHOPPRODUCTSID,
       SG.GROUPNAME, SCOST.NORMALCOST, splu.sellprice1, SSL.NAME as fmSuppliername,
       sdl.NAME as fmDeptName,SS.MAINSUPPLIER as fmMainSupplier, SS.UNITSPERCARTON as UPC
from SHOPPRODUCTSPLU SPLU
join SHOPPRODUCTS SP
    on SP.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID 
join SHOPGROUPLOOKUP SG
    on SG.SHOPGROUPLOOKUPID = SP.SHOPGROUPLOOKUPID and SP.STOREID = SG.STOREID 
join SHOPSUPPLIER SS
    on SS.SHOPPRODUCTSID = SP.SHOPPRODUCTSID and SS.STOREID = SP.STOREID
JOIN SHOPSUPPLIERLOOKUP SSL
    ON SSL.SHOPSUPPLIERLOOKUPID = SS.SHOPSUPPLIERLOOKUPID
join SHOPDEPTLOOKUP SDL
    ON SDL.SHOPDEPTLOOKUPID = SG.SHOPDEPTLOOKUPID
join SHOPPRODUCTSCOSTHST SCOST
    on SCOST.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID 
where SP.STOREID = 1 and SPLU.ACTIVEITEM = 'TRUE' and SP.ACTIVEITEM = 'TRUE'

我加入 SHOPPRODUCTSCOSTHST 现在,当我们只需要最新的时,下面 table 中的每笔费用都会有记录。

当前输出

一个解决方案是在 SHOPPRODUCTSCOSTHST 上的连接中添加一个条件,过滤具有最高 ID 的匹配记录:

join SHOPPRODUCTSCOSTHST SCOST
    on SCOST.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID 
    and SCOST.SHOPPRODUCTSCOSTHSID = (
        select max(SCOST1.SHOPPRODUCTSCOSTHSID)
        from SHOPPRODUCTSCOSTHST SCOST1
        where SCOST1.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID
    )

如果SHOPPRODUCTSCOSTHSID是table中的唯一键SHOPPRODUCTSCOSTHST,可以稍微简化一下:

join SHOPPRODUCTSCOSTHST SCOST
    on SCOST.SHOPPRODUCTSCOSTHSID = (
        select max(SCOST1.SHOPPRODUCTSCOSTHSID)
        from SHOPPRODUCTSCOSTHST SCOST1
        where SCOST1.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID
    )

为了此处的性能,您需要 SCOST(SHOPPRODUCTSID, SHOPPRODUCTSCOSTHSID) 上的索引。

一种可能的解决方案是使用 CTE。

如果您的 SHOPPRODUCTSCOSTHST table 有大量行,您可能不想使用我建议的方法。另一个因素是此查询是否执行得非常频繁。

CTE 将用于获取按 SHOPPRODUCTSID 分组的 SHOPPRODUCTSCOSTHST 的 MAX ID。然后我将在主查询中使用该 CTE,并将您的 INNER JOIN SCOST 约束在 CTE.MAX_SHOPPRODUCTSCOSTHSTID = SCOST.SHOPPRODUCTSCOSTHSTID 上。那 return 每个 SHOPPRODUCTSID 只有一行。

下面是一个例子。

  WITH MAXCOSTHST
    AS (
        SELECT SHOPPRODUCTSID
            ,MAX(SHOPPRODUCTSCOSTHSTID) MAX_SHOPPRODUCTSCOSTHSTID
        FROM SHOPPRODUCTSCOSTHST
        GROUP BY SHOPPRODUCTSID
        )
    SELECT SPLU.SHOPPRODUCTSPLUID
        ,SPLU.plu
        ,SPLU.description
        ,SPLU.SHOPPRODUCTSID
        ,SG.GROUPNAME
        ,SCOST.NORMALCOST
        ,splu.sellprice1
        ,SSL.NAME AS fmSuppliername
        ,sdl.NAME AS fmDeptName
        ,SS.MAINSUPPLIER AS fmMainSupplier
        ,SS.UNITSPERCARTON AS UPC
    FROM SHOPPRODUCTSPLU SPLU
    JOIN SHOPPRODUCTS SP ON SP.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID
    JOIN SHOPGROUPLOOKUP SG ON SG.SHOPGROUPLOOKUPID = SP.SHOPGROUPLOOKUPID
        AND SP.STOREID = SG.STOREID
    JOIN SHOPSUPPLIER SS ON SS.SHOPPRODUCTSID = SP.SHOPPRODUCTSID
        AND SS.STOREID = SP.STOREID
    JOIN SHOPSUPPLIERLOOKUP SSL ON SSL.SHOPSUPPLIERLOOKUPID = SS.SHOPSUPPLIERLOOKUPID
    JOIN SHOPDEPTLOOKUP SDL ON SDL.SHOPDEPTLOOKUPID = SG.SHOPDEPTLOOKUPID
    JOIN MAXCOSTHST ON MAXCOSTHST.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID
    JOIN SHOPPRODUCTSCOSTHST SCOST ON SCOST.SHOPPRODUCTSID = SPLU.SHOPPRODUCTSID
        AND MAXCOSTHST.MAX_SHOPPRODUCTSCOSTHSTID = SCOST.SHOPPRODUCTSCOSTHSTID
    WHERE SP.STOREID = 1
        AND SPLU.ACTIVEITEM = 'TRUE'
        AND SP.ACTIVEITEM = 'TRUE'