По сути, идея такова:
«развернуть» tblLossClaims
и вернуть два столбца: ключ tblLossClaims
(вы не упомянули ни одного, поэтому, я думаю, этобудет LossPolicyID
) и Item
= один элемент из LossPolicyID
.
Поиск совпадений unrolled.Item
в tblAutoPolicyList.PolicyIDList
.
Поиск совпадений различных matched.LossPolicyID
в tblLossClaims.LossPolicyID
.
Обновление tblLossClaims.PolicyReview
соответственно.
Главное ОБНОВЛЕНИЕможет выглядеть так:
UPDATE claims
SET PolicyReview = 'Y'
FROM tblLossClaims claims
JOIN (
SELECT DISTINCT unrolled.LossPolicyID
FROM (
SELECT LossPolicyID, Item = itemof(LossPolicyID)
FROM unrolling_join
) unrolled
JOIN tblAutoPolicyList
ON unrolled.ID = tblAutoPolicyList.PolicyIDList
) matched
ON matched.LossPolicyID = claims.LossPolicyID
Вы можете воспользоваться фиксированной шириной элемента и форматом фиксированного списка и, таким образом, легко разделить LossPolicyID
без UDF.Я могу видеть это с помощью таблицы чисел и SUBSTRING()
.unrolling_join
в приведенном выше запросе на самом деле tblLossClaims
объединено с таблицей чисел.
Вот определение unrolled
'увеличено':
...
(
SELECT LossPolicyID,
Item = SUBSTRING(LossPolicyID,
(v.number - 1) * @ItemLength + 1,
@ItemLength)
FROM tblLossClaims c
JOIN master..spt_values v ON v.type = 'P'
AND v.number BETWEEN 1 AND (LEN(c.LossPolicyID) + 2) / (@ItemLength + 2)
) unrolled
...
master..spt_values
- системная таблица, которая используется здесь как таблица чисел.Фильтр v.type = 'P'
дает нам набор строк с числовыми значениями от 0 до 2047, который сужается до списка чисел от 1 до количества элементов в LossPolicyID
.В конечном итоге v.number
служит индексом массива и используется для вырезания отдельных элементов.
@ ItemLength, конечно, просто LEN(tblAutoPolicyList.PolicyIDList)
.Я бы, вероятно, также объявил @ItemLength2 = @ItemLength + 2
, чтобы он не вычислялся каждый раз при применении фильтра.
По сути, все, если я ничего не пропустил.