在 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 查询
在 SQL Server 2008 中使用 Unpivot 或 Cross Apply 规范化数据