#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