在 DB2 数据库中转换 CROSS APPLY

Posted

技术标签:

【中文标题】在 DB2 数据库中转换 CROSS APPLY【英文标题】:Convert CROSS APPLY in DB2 database 【发布时间】:2021-01-25 11:35:00 【问题描述】:

我正在尝试将下面的 MSSQL 查询转换为 DB2 查询。 但我面临问题。我知道 DB2 不存在“CROSS APPLY”

SQL Server 查询:

SELECT DISTINCT p.ID,
p.COMPANY,
p.NAME,
format(d.startTime, 'yyyy-MM-dd HH:mm:ss.fff')
FROM PROCESS p 
CROSS APPLY (SELECT MAX(END_TIME) AS startTime FROM PROCESS WHERE ID = (SELECT MAX(ID) FROM PROCESS)) AS d
WHERE p.ID = (SELECT MAX(ID) FROM PROCESS)

错误:

错误:com.ibm.db2.jcc.c.SqlException:DB2 SQL 错误:SQLCODE:-104,SQLSTATE:42601,SQLERRMC:APPLY;N 进程 交叉;加入

如何将上述查询转换为 DB2 查询格式?

【问题讨论】:

使用CROSS JOIN 而不是CROSS APPLY 这能回答你的问题吗? Select first row in each GROUP BY group? 【参考方案1】:

SQL Server 手册说CROSS APPLY 与表函数一起使用。

https://docs.microsoft.com/en-us/sql/t-sql/queries/from-transact-sql?view=sql-server-ver15#using-apply

right_table_source 可以使用表值函数,该函数将 left_table_source 中的列作为函数的参数之一。

您的示例未使用任何示例,因此我假设它仅等同于 Db2 中的 CROSS JOIN

顺便说一句,这个语句可能会得到相同的结果(假设给定 ID 的 COMPANY 和 NAME 相同)

SELECT
    ID
,   COMPANY
,   NAME
,   format(END_TIME, 'yyyy-MM-dd HH:mm:ss.fff')
FROM
(   SELECT *
    ,   ROW_NUMBER() OVER(ORDER BY ID DESC, END_TIME DESC) AS RN
    FROM
        PROCESS p 
)
WHERE
    RN = 1

这在执行时可能会或可能不会更优化

【讨论】:

该引文中的重要词是“can”,这意味着可以使用表值函数。这不是一个要求。所以不,交叉应用不仅仅是相当于交叉连接。我认为交叉应用(或外部应用)是一种将一些过程编程引入基于通常集的 SQL 语言的方法。我不知道它是否被严格应用,但 APPLY 子句是按行应用的。我认为优化器独立于查询的其余部分处理 apply 子句,这对于复杂的查询很有用。

以上是关于在 DB2 数据库中转换 CROSS APPLY的主要内容,如果未能解决你的问题,请参考以下文章

Hive 上的 CROSS APPLY SQL Server 查询

在 XML 中使用 2 CROSS APPLY

在 SQL Server 2008 中使用 Unpivot 或 Cross Apply 规范化数据

mysql下分组取关联表指定提示方法,类似于mssql中的cross apply

CROSS APPLY VS STUFF 函数

使用 CROSS APPLY 与 OUTER APPLY 连接查询