我正在查詢一張對每個記錄有多個修訂版的表,但不存儲每條記錄的版本號。我必須從「接觸」日期中推導出它。什麼是確定記錄最新修訂的最有效方法?
我想檢索最新版本。
我在兩種方法之間揮之不去: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