简体   繁体   English

加入最大改进查询

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

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