2016-08-04 5 views
0

У меня есть сложное обновление. Любая помощь высоко ценится. Заранее спасибо за вашу помощь.Tricky SQL update

Вот сценарий, как показано на прилагаемом изображении. Я должен обновить P_main.ver_key от Versions.verkey, где P_main.ver_key - null. Логика состоит в том, чтобы получить ver_key за это pid, где Versions.pcmm <= max(P_main.vdmm). Значения, которые должны быть заполнены в нулевых точках, отображаются в столбце «после обновления» на изображении.

Пример:

P_main стол:

pid = 50000178 
vcmm = 2014027001 

Versions стол:

pid = 50000178 
max pdmm <=2014027001 is 2014032000 

поэтому

update ver_key = 154 

sample data

ответ

1

Это может быть не самым быстрым способом, но он должен работать:

WITH CTE AS 
(
    SELECT P.*, Q.ver_key ver_key_new 
    FROM P_Main P 
    CROSS APPLY(SELECT TOP 1 ver_key 
       FROM Versions 
       WHERE pid = P.pid 
       AND vdmm <= P.vcmm 
       ORDER BY vdmm DESC) Q 
    WHERE P.ver_key IS NULL 
) 
UPDATE CTE 
SET ver_key = ver_key_new; 
+0

Это обновит КТР, который я думаю, как временная таблица. Мне придется обновить физическую таблицу с помощью CTE. Это правильно? Где добавить ограничение для обновления только там, где ver_key равно null? – user1689992

+0

Нет, это обновит 'P_Main'. Для вашего условия я обновил свой ответ – Lamak

+0

Можете ли вы, пожалуйста, пометить запрос псевдонимами таблицы для внутреннего запроса, чтобы я понял его более четко. Мне нужен P_Main.vcmm <= max (Версии pdmm). – user1689992