获取从一对多关系 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'
我目前正在开发一个 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'