[英]Join with max improve query
select Tf.*
from SalesOrder SO
join TransportOrder Tf on Tf.SalesOrderID = SO.SalesOrderID
join (
select Sz.TradingPartner, Sz.ExternalSalesOrder, Tz.TransportOrderNumber, max(Tz.Revision) Revision
from SalesOrder Sz
join TransportOrder Tz on Sz.SalesOrderID = Tz.SalesOrderID
group by Sz.TradingPartner, Sz.ExternalSalesOrder, Tz.TransportOrderNumber
) TU on TU.TradingPartner = SO.TradingPartner and TU.ExternalSalesOrder = SO.ExternalSalesOrder and TU.TransportOrderNumber = Tf.TransportOrderNumber and Tf.Revision = TU.Revision
I want to know If I can improve it?我想知道我是否可以改进它?
What I want to do: select the TransportOrders that have the maximum revision.我想做的是:select 具有最大修订的 TransportOrders。 a transport order can be identified with salesOrder.TradingPartner, salesOrder.ExternalSalerOrder, transportOrder.TransportOrderNumer and transportOrder.Revision (used as a version field) so I want all the transportorder with last version
可以使用 salesOrder.TradingPartner、salesOrder.ExternalSalerOrder、transportOrder.TransportOrderNumer 和 transportOrder.Revision(用作版本字段)来识别运输订单,所以我想要所有带有最新版本的运输订单
You can use the ROW_NUMBER
analytical function as follows:您可以使用
ROW_NUMBER
解析 function 如下:
SELECT * FROM
(SELECT TF.*,
ROW_NUMBER()
OVER (PARTITION BY SZ.TRADINGPARTNER,
SZ.EXTERNALSALESORDER,
TZ.TRANSPORTORDERNUMBER
ORDER BY TZ.REVISION DESC) AS RN
FROM SALESORDER SO
JOIN TRANSPORTORDER TF
ON TF.SALESORDERID = SO.SALESORDERID
JOIN SALESORDER SZ
ON SZ.TRADINGPARTNER = SO.TRADINGPARTNER
AND SZ.EXTERNALSALESORDER = SO.EXTERNALSALESORDER
JOIN TRANSPORTORDER TZ
ON SZ.SALESORDERID = TZ.SALESORDERID
AND TRANSPORTORDERNUMBER = TF.TRANSPORTORDERNUMBER
)
WHERE TF.REVISION = TU.REVISION
I would suggest window functions我会建议 window 功能
select st.*
from (select t.*, so.TradingPartner, so.ExternalSalerOrder,
max(t.revision) over (partition by so.TradingPartner, so.ExternalSalerOrder, t.TransportOrderNumber) as max_revision
from SalesOrder SO join
TransportOrder t
on t.SalesOrderID = so.SalesOrderID
) st
where revision = max_revision;
No need to reopen the two tables.无需重新打开这两个表。 You can use window functions like this:
您可以像这样使用 window 函数:
select *
from (
select t.*,
rank() over(
partition by s.TradingPartner, s.ExternalSalerOrder, t.TransportOrderNumer
order by t.Revision desc
) rn
from SalesOrder s
join TransportOrder t on t.SalesOrderID = s.SalesOrderID
) t
where rn = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.