2010-08-27 83 views
0

我有一個包含三列的表(PAT_PROCEDURES):patient_id,procedure_id,procedure_date和token_id,用於存儲關於患者和程序以及過程日期的記錄;令牌ID是一個特殊的數字標識符。對最近日期的SQL查詢和另一列的約束

我也有另一個表(PAT_TOKENS)與三列patient_id和token_id,它有第一個表中的那些患者的子集,但令牌ID爲0.我試圖更新令牌ID爲從第一個表,其中的程序是程序IDS的有限列表中的一個基本....這裏執行的最近程序是我到目前爲止有:

merge into pat_tokens t 
using (
    -- select all patients with most recent procedure among procedure IDs (45, 66, 78) 
) procs on (t.patient_id = procs.patient_id) 
when matched then 
update set t.token_id = procs.token_id 

的評論選擇查詢是我」正在掙扎着。

謝謝!

+0

對於什麼數據庫? – 2010-08-27 02:12:23

+0

數據庫是Oracle – wsb3383 2010-08-27 04:24:58

回答

1
select patient_id 
from PAT_procedure P 
    inner join (select procedure_id, max(procedure_date) as last_date 
       from PAT_procedure 
       where procedure_id in (45, 66, 78) 
       group by procedure_id) mx 
    on p.procedure_id = mx.procedure_id and p.procedure_date = mx.last_date 
0

你沒有說哪個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正確的那一行,您應該擁有它。我會盡力回到這個明天......

+0

對不起,我忘了提數據庫,它是Oracle – wsb3383 2010-08-27 04:27:18