简体   繁体   English

获取从一对多关系火鸟加入的最后一条记录

[英]Getting last record on join from one to many relationship Firebird

I'm currently working on a Firebird database where the product to product cost table is one to many.我目前正在研究一个 Firebird 数据库,其中产品到产品成本表是一对多的。 I need to include the most current cost (highest ID) in product listing script.我需要在产品列表脚本中包含最新的成本(最高 ID)。

I'm not sure how to do this on a one to many relation.我不确定如何在一对多的关系上做到这一点。

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'

My join on SHOPPRODUCTSCOSTHST will now bring in a record for every cost in the table below when we only need the newest.当我们只需要最新的时,我加入SHOPPRODUCTCOSTHST现在将在下表中记录每项费用。

成本表

Current output当前 output

在此处输入图像描述

One solution would be to add a condition to the join on SHOPPRODUCTSCOSTHST that filters on the matching record that has the highest id:一种解决方案是在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
    )

If SHOPPRODUCTSCOSTHSID is a unique key in table SHOPPRODUCTSCOSTHST , this can be simplified a little:如果SHOPPRODUCTSCOSTHSID是表SHOPPRODUCTSCOSTHST中的唯一键,则可以稍微简化一下:

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

For performance here, you want an index on SCOST(SHOPPRODUCTSID, SHOPPRODUCTSCOSTHSID) .对于此处的性能,您需要SCOST(SHOPPRODUCTSID, SHOPPRODUCTSCOSTHSID)上的索引。

One possible solution is to use a CTE.一种可能的解决方案是使用 CTE。

Some factors in which you wouldn't want to use the method i am proposing is if your SHOPPRODUCTSCOSTHST table has a large number of rows.您不想使用我建议的方法的一些因素是您的 SHOPPRODUCTCOSTHST 表是否有大量行。 Another factor would be if this query is executed very frequently.另一个因素是该查询是否非常频繁地执行。

The CTE would be used to get the MAX ID of SHOPPRODUCTSCOSTHST grouped by SHOPPRODUCTSID. CTE 将用于获取按 SHOPPRODUCTSID 分组的 SHOPPRODUCTCOSTHST 的 MAX ID。 Then I would use that CTE in the main query and constrain your INNER JOIN SCOST on CTE.MAX_SHOPPRODUCTSCOSTHSTID = SCOST.SHOPPRODUCTSCOSTHSTID.然后,我将在主查询中使用该 CTE,并将您的 INNER JOIN SCOST 限制在 CTE.MAX_SHOPPRODUCTSCOSTHSTID = SCOST.SHOPPRODUCTCOSTHSTID 上。 That would return only one row per SHOPPRODUCTSID.每个 SHOPPRODUCTSID 只会返回一行。

below is an example.下面是一个例子。

  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'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM