[英]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.