HANA SQL联接替代交叉应用/横向

问题描述

我有Microsoft sql Server的背景,经常使用诸如CROSS APPLYCTE(公用表表达式)之类的功能来编写查询。我目前正在尝试使用CROSS APPLY在SAP HANA中编写查询,但似乎不受支持

我确实发现LEFT OUTER JOIN LAteraL可能等同于Microsoft sql Server CROSS APPLY,但是在我正在使用的SAP HANA版本中(SAP HANA版本2.00.037.02.1562323855 [系统->状态])。看来它已经在HANA 2.0 SPS04版中发布了,但这不是我公司所使用的。

这是我过去成功使用的CROSS APPLY替代品的示例。但是性能似乎变差了,我摆脱了内存错误。我怀疑数据集正在增长并且变得很大,并且查询效率越来越低。

FROM SAPECC.AUFK AS AUFK

LEFT OUTER JOIN
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY MANDT,OBJNR ORDER BY UDATE DESC) AS RowNumber
FROM SAPECC.JCDS
WHERE STAT = 'I0045' AND INACT = ''
) JCDS ON JCDS.OBJNR = AUFK.OBJNR AND JCDS.MANDT = AUFK.MANDT AND JCDS.RowNumber = 1

有其他建议吗?

解决方法

您可能想尝试使用相关子查询而不是ROW_NUMBER()

select ...
from sapecc.aufk as a
left join sapecc.jcds as j
    on  j.objnr = a.objnr 
    and j.mandt = a.mandt
    and j.stat = 'I0045' 
    and j.inact = ''
    and j.udate = (
        select max(j1.udate)
        from sapecc.jcds as j1
        where 
            j1.objnr = a.objnr 
            and j1.mandt = a.mandt
            and j1.stat = 'I0045' 
            and j1.inact = ''
    )

此查询应利用(objnr,mandt,stat,inact,udate desc)上的索引。

,

您可以将MSSQL与HANA所用的CTE方法相同:

WITH most_recent_JCDS as (
    SELECT * FROM (
        SELECT *,ROW_NUMBER() 
                OVER (PARTITION BY MANDT,OBJNR 
                      ORDER BY UDATE DESC) AS RowNumber
        FROM SAPECC.JCDS
        WHERE STAT = 'I0045' 
        AND INACT = '')
    WHERE   
        RowNumber = 1)

SELECT 
      AUFK. ...,JCDS. ...

FROM 
                         SAPECC.AUFK AUFK
    LEFT OUTER JOIN most_recent_JCDS JCDS
ON 
     (JCDS.OBJNR,JCDS.MANDT) 
   = (AUFK.OBJNR,AUFK.MANDT);

关于性能或查询效率的担忧只能通过检查实际执行来解决。 PlanViz和EXPLAIN PLAN是实现此目的的工具。

假设某些索引“应该”帮助提供了50/50的机会来使其正确(最好)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...