SELECT
tchart.*
INTO
#OrderSections
FROM
Order.Charts tchart
INNER JOIN
(
SELECT
tchart.ID,
tchart.ORCode,
tchart.SectionalDistance,
row_number() OVER( PARTITION BY rrs.ORCode ORDER BY tchart.VendorTimestampUTC DESC, tchart.InsertedTimestampUTC DESC, tchart.ID DESC ) AS RecordIndex
FROM
#OrderStaging rrs
INNER JOIN
Order.Charts tchart
ON
rrs.ORCode = tchart.ORCode
) AS Latest_tchart
ON
tchart.ID = Latest_tchart.ID
WHERE
Latest_tchart.RecordIndex = 1;
With cte as(
SELECT
tchart.ID,
tchart.ORCode,
tchart.SectionalDistance,
row_number() OVER( PARTITION BY rrs.ORCode ORDER BY tchart.VendorTimestampUTC DESC, tchart.InsertedTimestampUTC DESC, tchart.ID DESC ) AS RecordIndex
FROM
#OrderStaging rrs
INNER JOIN
Order.Charts tchart
ON
rrs.ORCode = tchart.ORCode)
SELECT
cte.*
INTO
#OrderSections
FROM
cte
WHERE
RecordIndex = 1
CTE 是否会在存储过程中产生重大影响?
要回答有关性能和执行计划的问题,您应该查看查询的特定计划。
但是,我希望查询具有相同的执行计划,无论逻辑是在子查询中还是在 CTE 中。 这在 SQL Server 中是正确的,但在其他数据库中则不然。 例如,Postgres 实现了 CTE,因此您会期望性能差异。
编辑:
分层查询(递归 CTE(需要 CTE。 对于其他查询,它们很方便 - 并且非常方便,因为您可以在同一查询中多次引用 CTE。 但是,它们对 SQL Server 中的执行计划没有特定影响。 CTE 被替换到查询中,整个处理过程被优化为一次。