簡體   English   中英

獲取從一對多關系火鳥加入的最后一條記錄

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

我目前正在研究一個 Firebird 數據庫,其中產品到產品成本表是一對多的。 我需要在產品列表腳本中包含最新的成本(最高 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'

當我們只需要最新的時,我加入SHOPPRODUCTCOSTHST現在將在下表中記錄每項費用。

成本表

當前 output

在此處輸入圖像描述

一種解決方案是在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是表SHOPPRODUCTSCOSTHST中的唯一鍵,則可以稍微簡化一下:

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

對於此處的性能,您需要SCOST(SHOPPRODUCTSID, SHOPPRODUCTSCOSTHSID)上的索引。

一種可能的解決方案是使用 CTE。

您不想使用我建議的方法的一些因素是您的 SHOPPRODUCTCOSTHST 表是否有大量行。 另一個因素是該查詢是否非常頻繁地執行。

CTE 將用於獲取按 SHOPPRODUCTSID 分組的 SHOPPRODUCTCOSTHST 的 MAX ID。 然后,我將在主查詢中使用該 CTE,並將您的 INNER JOIN SCOST 限制在 CTE.MAX_SHOPPRODUCTSCOSTHSTID = SCOST.SHOPPRODUCTCOSTHSTID 上。 每個 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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM