Я пытаюсь создать таблицу поиска ANI из 2 отдельных таблиц, одна из которых представляет собой таблицу магазинов, а другая - список контактов для этих магазинов.
Я использую MS SQL Server 2005, который, к сожалению, не поддерживает синтаксис MERGE INTO ...
Хорошие вещи:
Таблица поиска ANI имеет 2 значимых столбца, StoreID и PhoneNumber. Столбец PhoneNumber является (уникальным) первичным ключом, поскольку для данного PhoneNumber должен быть возвращен только один StoreID.
Store_Info значимые столбцы:
StoreID
StorePhone
AltPhone
Для каждого StoreID существует одна запись с возможными дублирующимися телефонными номерами между магазинами. И да, AltPhone может быть таким же, как StorePhone ...
Store_Contacts значимые столбцы:
StoreID
Phone
Для StoreID имеется несколько записей и, возможно, дубликаты телефонных номеров для одного или нескольких магазинов.
Пример хранилища данных
StoreID Parent ID StorePhone AltPhone
1 0 402-123-2300 402-123-2345
2 0 202-321-7800 202-321-7890
3 1 202-302-5600 202-302-5600
Пример данных о контактах:
StoreID Title Name Phone
1 Mgr Bob 402-123-2345
1 IT Pat 402-123-2346
1 Reg Mgr Dave 402-321-3213
2 Mgr Ann 202-231-7890
2 IT Mary 202-231-7893
2 A/R Ann 202-231-7890
2 Reg Mgr Dave 402-321-3213
3 Mgr Bob 402-123-2345
3 AsstMgr Pete 402-123-2356
Я хочу вставить номера телефонов в следующем порядке:
- Главный / единый магазин StorePhone
- Главный / единый магазин AltPhone
- Филиал StorePhone
- Филиал магазина AltPhone
- Контактный телефон основного / единственного магазина
- Контактный телефон филиала
- Если номер телефона уже существует в таблице назначения, не добавляйте его ...
Таким образом, результирующий набор данных должен быть:
StoreID Phone
1 402-123-2300 (first pass)
2 202-321-7800
1 402-123-2345 (2nd pass)
2 202-321-7890
3 202-302-5600 (3rd & 4th pass - only add once)
1 402-123-2346 (5th pass - skip dup)
1 402-321-3213
2 202-231-7893 (do not add dups)
3 402-123-2356 (final pass - skip dup)
Мой подход к расстановке приоритетов по номеру телефона для дубликатов - сделать несколько запросов на основе других критериев (например, основное хранилище и ветвь), вставив первую найденную запись в таблицу поиска ANI и пропуская последующие дубликаты.
Как мне это сделать без использования RBAR? Я безуспешно попробовал следующее - на самом деле, все работает нормально, пока я не попадаю в таблицу Store_Contacts, где может быть несколько идентичных телефонных номеров для данного магазина:
INSERT INTO dbo.Store_PhoneNumbers (StoreID, PhoneNumber)
SELECT DISTINCT StoreID, dbo.GetPhoneNumber10(StorePhone)
FROM dbo.Store_Info
WHERE dbo.IsAniNumber(dbo.GetPhoneNumber10(StorePhone)) = 1
AND ParentID = 0
AND NOT EXISTS (SELECT * FROM dbo.Store_PhoneNumbers WHERE PhoneNumber = dbo.GetPhonenumber10(StorePhone));
... повторите для AltPhone, затем StorePhone, где ParentID <> 0, затем AltPhone w / ParentID <> 0
Пока все хорошо, вот где это разваливается:
INSERT INTO dbo.Store_PhoneNumbers (StoreID, PhoneNumber)
SELECT DISTINCT sc.StoreID, dbo.GetPhoneNumber10(sc.Phone)
FROM Store_Contacts sc
INNER JOIN
Store_Info si ON sc.StoreID = si.StoreID
WHERE (dbo.IsAniNumber(dbo.GetPhoneNumber10(sc.Phone)) = 1)
AND (si.ParentID = 0)
AND NOT EXISTS (SELECT * FROM dbo.Store_PhoneNumbers WHERE PhoneNumber = dbo.GetPhonenumber10(sc.Phone));
... и повторите для ParentID <> 0
Вот где я получаю дубликаты записей, и вставка не выполняется.
Спасибо за любую помощь, которую вы можете мне дать, я собираюсь сдаться и использовать курсор, просто чтобы сделать это ...
Dave