2011-02-03 3 views
4

Имейте в виду, что я использую 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.

+0

Таким образом, вы пишете хранимую процедуру де-нормализуют модель данных? – diagonalbatman

+0

Является ли поле PolicyIDList единственным полем с ограниченным списком идентификаторов политики? (AAAA BBBB CCCC или AAAA, BBBB, CCCC)? – jbehren

+0

PolicyIDList - это поле, содержащее только один идентификатор в строке; LossPolicyID - это поле с разделенными запятыми значениями; – user279521

ответ

0

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

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

+0

Также ознакомьтесь с http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648 за помощью по созданию функции split – jbehren

1

В принципе, идея заключается в следующем:

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

  2. Найти совпадения unrolled.Item в tblAutoPolicyList.PolicyIDList.

  3. Найти совпадения от matched.LossPolicyID в tblLossClaims.LossPolicyID.

  4. Обновление tblLossClaims.PolicyReview соответственно.

Основной UPDATE может выглядеть следующим образом:

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

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

2

Выберите LossPolicyID * из TABLENAME где CHARINDEX ('PolicyID', LossPolicyID, 1)> 0

Смежные вопросы