Помогите с сложным запросом соединения - PullRequest
4 голосов
/ 03 февраля 2011

Имейте в виду, я использую SQL 2000

У меня есть две таблицы.

tblAutoPolicyList содержит поле с именем PolicyIDList.

tblLossClaims содержит два поля, которые называются LossPolicyID & PolicyReview.

Я пишу сохраненный процесс, который получит отдельное поле PolicyID из PolicyIDList и перебирает поле LossPolicyID (если совпадение найдено, установите PolicyReview в 'Y').

Пример таблицы:

PolicyIDList        LossPolicyID 
9651XVB19       5021WWA85, 4421WWA20, 3314WWA31, 1121WAW11, 2221WLL99       Y
5021WWA85       3326WAC35, 1221AXA10, 9863AAA44, 5541RTY33, 9651XVB19       Y
0151ZVB19       4004WMN63, 1001WGA42, 8587ABA56, 8541RWW12, 9329KKB08       N

Как мне написать записанный хранимый процесс (ища логику больше, чем синтаксис)?

Имейте в виду, что я использую SQL 2000.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2011

Выберите LossPolicyID, * из tableName, где charindex («PolicyID», LossPolicyID, 1)> 0

1 голос
/ 11 февраля 2011

По сути, идея такова:

  1. «развернуть» tblLossClaims и вернуть два столбца: ключ tblLossClaims (вы не упомянули ни одного, поэтому, я думаю, этобудет LossPolicyID) и Item = один элемент из LossPolicyID.

  2. Поиск совпадений unrolled.Item в tblAutoPolicyList.PolicyIDList.

  3. Поиск совпадений различных matched.LossPolicyID в tblLossClaims.LossPolicyID.

  4. Обновление 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, чтобы он не вычислялся каждый раз при применении фильтра.

По сути, все, если я ничего не пропустил.

0 голосов
/ 03 февраля 2011

Если поле PolicyIDList представляет собой список с разделителями, сначала необходимо отделить отдельные идентификаторы политики и создать временную таблицу со всеми результатами. Затем используйте запрос на обновление к tblLossClaims с 'где существует (выберите * из #temptable tt, где tt.PolicyID = LossPolicyID).

В зависимости от размера таблицы / данных вы можете добавить индекс во временную таблицу.

...