Обновить Max (ID) с помощью внутреннего соединения в поле даты

#tsql #stored-procedures

#tsql #хранимые процедуры

Вопрос:

У меня есть хранимая процедура, которая обновит несколько строк, где есть совпадение между двумя таблицами в нескольких столбцах данных.

В TD таблице может быть несколько совпадений, и я хотел бы обновить только MAX(TID) запись в TD таблице. Я пробовал это несколькими различными способами, и я либо получаю обновление по всем совпадениям, либо ничего не обновляется.

Соединение использует a Date of Birth и несколько других столбцов для поиска соответствия. Мне нужно обновить SubID и несколько других полей, где я нахожу совпадение.

Каков наилучший и наиболее эффективный способ сделать это?

 Update TD
       SET     
       TD.SubID = NM.SubscriberID,  
       TD.EffectiveDate = NM.EffectiveDate,
       TD.LastUpdate = GETDATE()
       FROM TD
        INNER JOIN NM
        ON TD.DateofBirth = NM.DateofBirth
        WHERE       
        TD.MemberFirst = NM.MemberFirst
        AND TD.MemberLast = NM.MemberLast   
        AND TID IN (     
                        SELECT MAX(TID)
                        FROM TD td2             
                        INNER JOIN NM nm2
                        ON td2.DateofBirth = nm2.DateofBirth
                        WHERE td2.MemberFirst = nm2.MemberFirst
                        AND td2.MemberLast = nm2.MemberLast 
                );
  

Результаты этого = ничего не обновлено. Что мне нужно сделать, чтобы обновить только MAX(TID) запись?

Ответ №1:

Если вам интересно, причина, по которой ваш опубликованный код не работает, заключается в том, что ваш подзапрос вообще не связан с вашим внешним запросом.

Вы говорите, что ничего не обновляется, но на самом деле должна обновляться одна строка: строка с MAX(TID) во всей таблице. Возможно, это только выглядит так, что эта строка не обновляется, потому что в ней уже есть значения, на которые ваш код изменил бы ее.

Ваш код должен работать, если вы просто измените последнее предложение на это:

     AND TID = (     
                    SELECT MAX(TID)
                    FROM TD td2          
                    WHERE  td2.DateofBirth = NM.DateofBirth
                    AND td2.MemberFirst = NM.MemberFirst
                    AND td2.MemberLast = NM.MemberLast 
            );
  

Ответ №2:

Не уверен, что это наиболее эффективно, но я бы использовал общее табличное выражение, чтобы получить max(tid) для каждой комбинации DateofBirth , MemberFirst и MemberLast и обновить таблицу, присоединенную к cte:

 WITH CTE AS
(
    SELECT TD.DateofBirth, TD.MemberFirst, TD.MemberLast, MAX(TID) As MaxTID
    FROM TD 
    INNER JOIN NM 
    ON TD.DateofBirth = NM.DateofBirth
    WHERE TD.MemberFirst = NM.MemberFirst
    AND TD.MemberLast = NM.MemberLast 
    GROUP BY TD.DateofBirth, TD.MemberFirst, TD.MemberLast
)

UPDATE T
SET SubID = NM.SubscriberID,  
    EffectiveDate = NM.EffectiveDate,
    LastUpdate = GETDATE()
FROM TD As T
JOIN CTE 
    ON T.DateofBirth = CTE.DateofBirth
    AND T.MemberFirst = CTE.MemberFirst
    AND T.MemberLast = CTE.MemberLast
    AND T.TID = CTE.MaxTID