我正在查询一张对每个记录有多个修订版的表,但不存储每条记录的版本号。我必须从“接触”日期中推导出它。什么是确定记录最新修订的最有效方法?
我想检索最新版本。
我在两种方法之间挥之不去:ROW_NUMBER()
和LEFT OUTER JOIN
但我不确定哪一个会更好。也许这取决于上下文,但我不确定要考虑哪些因素。我不知道这些表格上的索引。
这两种方法在性能上是否存在显着差异?
ROW_NUMBER()
:
SELECT *
FROM
(
SELECT h.header_id,
h.touched_on,
ROW_NUMBER() OVER (PARTITION BY h.header_id ORDER BY h.touched_on DESC) AS revision
FROM header h
JOIN event e ON h.serial_no = e.serial_no
WHERE h.touched_on BETWEEN @startDate AND @endDate
) noms
WHERE noms.revision = 1
LEFT JOIN
:
SELECT h.header_id,
h.touched_on,
FROM header h
LEFT OUTER JOIN header h2 ON h2.header_id = h.header_id AND h2.touched_on > h.touched_on
JOIN event e ON h.serial_no = e.serial_no
WHERE h.touched_on BETWEEN @startDate AND @endDate
AND h2.header_id IS NULL
我的意思是,你有数据,可以测试两个查询。无论如何,它们不是等价的,第二个不会返回你似乎想要的数据 – Lamak
你看过两种选项的查询计划吗?一个人明显比另一个人长吗? – Siyual
首先,它们是不同的查询。第二个可能为header_id返回多个原始数据。 – Serg