Вы не сказали, какая СУБД, но предполагаете, что SQL 2008 пока что, поскольку она имеет MERGE ...
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
Я надеюсь, что у вас есть индекс для Patient_id в pat_procedures.Было бы замечательно, если бы он был кластеризованным, или даже лучше, если это некластеризованный индекс с включенными значениями method_id, token_id и method_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)
Я не уверен, что правильно понял, что вы ищете, но ответьте, и я обновлю какнеобходимо.
ОБНОВЛЕНИЕ
Теперь, когда я знаю, что это Oracle, я не смогу просто запросить у вас запрос.
Но язнаю, что Oracle поддерживает оконные функции.Если вы можете перевести любой из моих запросов выше в правильный синтаксис Oracle, который присваивает номер 1 каждой строке с самой последней датой в производной таблице, а затем присоединитесь к той, где идентификаторы процедур верны, у вас должен быть этот.Я попытаюсь вернуться к этому завтра ...