У меня есть таблица с именем 1 Main Contacts ("Main") и несколько других таблиц. Все они имеют столбец с именем Contact_ID (или referral_ID), который подключает их. Проблема, связанная со всеми настройками, заключается в том, что записи в «Main» могут быть связаны с несколькими записями в таблице ссылок, поэтому я получаю дубликаты записей после выполнения запроса на выборку контактов в столбце «Contact_Source», который находится в реферальная таблица.
Я создал представление, из которого я могу выбирать при выполнении запросов с веб-сайта, поэтому я перетаскиваю данные, относящиеся к правильной ситуации. Я также запускаю этот запрос по их «Контактному источнику». Я опубликовал 2 вопроса ранее ( здесь и здесь ), чтобы не получить дубликаты записей. У меня это работает.
Вот последний код, который я получил, чтобы помешать мне получить дубликаты записей:
ALTER VIEW dbo.v_angelview AS
WITH q AS
(
SELECT dbo.[1_MAIN - Contacts].Contact_ID, dbo.[1_MAIN - Contacts].Date_entered_into_Database, dbo.[1_MAIN - Contacts].Date_of_Initial_Contact,
dbo.[1_MAIN - Contacts].[Company_ Name], dbo.[1_MAIN - Contacts].Key_Contact_Title, dbo.[1_MAIN - Contacts].Key_Contact_First_Name,
dbo.[1_MAIN - Contacts].Key_Contact_Middle, dbo.[1_MAIN - Contacts].Key_Contact_Last_Name, dbo.[1_MAIN - Contacts].Key_Credential,
dbo.[1_MAIN - Contacts].Key_Contact_Occupation, dbo.[1_MAIN - Contacts].Key_Degree_1, dbo.[1_MAIN - Contacts].Key_Degree_2,
dbo.[1_MAIN - Contacts].Key_Degree_3, dbo.[1_MAIN - Contacts].Date_of_Highest_Degree, dbo.[1_MAIN - Contacts].Work_Setting,
dbo.[1_MAIN - Contacts].Website_Address, dbo.[1_MAIN - Contacts].Email_1_Key_Contact, dbo.[1_MAIN - Contacts].Email_2,
dbo.[1_MAIN - Contacts].Email_3, dbo.[1_MAIN - Contacts].Day_Time_Phone_Number, dbo.[1_MAIN - Contacts].Extension,
dbo.[1_MAIN - Contacts].Mobile_Phone_Number, dbo.[1_MAIN - Contacts].Bus_Fax_Number, dbo.[1_MAIN - Contacts].Home_Phone_Number,
dbo.[1_MAIN - Contacts].Home_Fax_Number, dbo.[1_MAIN - Contacts].Mailing_Street_1, dbo.[1_MAIN - Contacts].Mailing_Street_2,
dbo.[1_MAIN - Contacts].Mailing_City, dbo.[1_MAIN - Contacts].Mailing_State, dbo.[1_MAIN - Contacts].[Mailing_Zip/Postal],
dbo.[1_MAIN - Contacts].Mailing_Country, dbo.[1_MAIN - Contacts].[Bad_Address?], dbo.[1_MAIN - Contacts].[PROV/REG?],
dbo.[1_MAIN - Contacts].status_flag, dbo.[1_MAIN - Contacts].status_flag AS status_flag2, dbo.Providers.Referral_Source, dbo.Referral.Contact_Source,
dbo.Resource_Center.cert_start_date, dbo.Resource_Center.cert_exp_date, dbo.prov_training_records.Contact_ID AS Expr2,
dbo.prov_training_records.date_reg_email_sent, dbo.Resource_Center.access, dbo.Providers.Contact_ID AS Expr1,
ROW_NUMBER() OVER (PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID ORDER BY dbo.[1_MAIN - Contacts].Contact_ID) AS rn
FROM dbo.[1_MAIN - Contacts]
INNER JOIN
dbo.Referral
ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID
INNER JOIN
dbo.prov_training_records
ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID
LEFT OUTER JOIN
dbo.Resource_Center
ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID
FULL OUTER JOIN
dbo.Providers
ON dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID
WHERE (dbo.[1_MAIN - Contacts].Mailing_State = N'AL') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'FL') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'GA') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'KY') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'MS') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'NC') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'SC') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'TN') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'PR') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'CO') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'MT') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'ND') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'SD') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'UT') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'WY') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'AR') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'LA') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'NM') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'OK') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'TX') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'AZ') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'CA') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'HI') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'ID') OR
(dbo.[1_MAIN - Contacts].Mailing_State = N'NV')
)
SELECT *
FROM q
WHERE rn = 1
Теперь проблема, с которой я сталкиваюсь, заключается в том, что мне нужно установить приоритет того, какую дубликатную запись я храню, а какую удаляют.
Это иерархия приоритетов, начинающаяся с самого прецедента:
- Contact_Source = 'ПРОВАЙДЕР'
- Contact_Source LIKE 'RG _%'
- Contact_Source LIKE 'IN _%'
- Contact_Source LIKE 'LD _%'
Запись может быть связана с одним или всеми из них. Так, например, если запись имеет PROVIDER и RG_Train, я хочу сохранить запись с PROVIDER. И так далее по списку. Опять же, все записи имеют Contact_ID, поэтому я могу сказать, что есть дубликаты.
Есть ли способ изменить мой существующий SQL, чтобы сделать это, или это требует нового подхода? Если да, то как я могу удалить дубликаты записей в соответствии с моим списком приоритетов?
Я использую SQL Server 2005.
Заранее спасибо!