你沒有說哪個DBMS,但現在假定SQL 2008,因爲它有合併...
UPDATE t
SET t.token_id = x.token_id
FROM
pat_tokens t
CROSS APPLY (
SELECT TOP 1 p.token_id
FROM pat_procedures p
WHERE
p.procedure_id IN (45, 66, 78)
AND p.patient_id = t.patient_id
ORDER BY p.procedure_date DESC
) x
WHERE t.token_id <> procs.token_id
我當然希望你有pat_procedures上patient_id的索引。假如非聚簇索引比聚簇索引窄,那麼它將會很好,如果它是聚簇的,或者它更好,如果它是一個包含了procedure_id,token_id和procedure_date的非聚簇索引。如果你不需要它,不要去創建這個最後的索引。
我才意識到我可能誤會了,或許這就是你的意思:
UPDATE t
SET t.token_id = x.token_id
FROM
pat_tokens t
CROSS APPLY (
SELECT TOP 1 p.token_id, p.procedure_id
FROM pat_procedures p
WHERE p.patient_id = t.patient_id
ORDER BY p.procedure_date DESC
) x
WHERE
t.token_id <> x.token_id
AND x.procedure_id IN (45, 66, 78)
這裏的另一種方法,只是回答你的問題,你正在尋找這一次的SELECT語句:
SELECT patient_id
FROM (
SELECT TOP 1 * WITH TIES
FROM pat_procedures p
ORDER BY p.procedure_date DESC
) x
WHERE x.procedure_id IN (45, 66, 78)
我不確定我是否正確地查找了您要查找的內容,但回覆並根據需要進行更新。
UPDATE
現在,我知道這是甲骨文,我將不能夠只是鞭打查詢你。
但我知道Oracle支持窗口功能。如果您可以將上面的任何一個查詢轉換爲正確的Oracle語法,該語法爲派生表中最近日期的每行賦予數字1,然後加入到過程id正確的那一行,您應該擁有它。我會盡力回到這個明天......
對於什麼數據庫? – 2010-08-27 02:12:23
數據庫是Oracle – wsb3383 2010-08-27 04:24:58