2017-02-22 21 views
1

Im пытается вставить данные из одной базы данных в другую. Это то, что я до сих пор, на избранной стороне:TSQL - несколько значений в INSERT (из-за объединений)

USE [db2] 
SELECT 
    sP.pers_FirstName 
    ,sp.pers_LastName 
    ,sPH.Phon_Number 
    ,CASE WHEN LEFT(sPH.Phon_Number, 2) = '04' THEN sPH.Phon_number ELSE NULL END 
    ,CASE WHEN sp.pers_gender = 1 THEN 'M' WHEN sp.pers_gender = 2 THEN 'F' ELSE 'U' END 
    ,CASE 
     WHEN sP.pers_salutation = '10'  THEN 8 
     WHEN sp.pers_salutation = '6'  THEN 2 
     WHEN sp.pers_salutation = '7'  THEN 1 
     WHEN sp.pers_salutation = '8'  THEN 4 
     WHEN sp.pers_salutation = '9'  THEN 5 
     WHEN sp.pers_salutation = 'APROF' THEN 6 
     WHEN sp.pers_salutation = 'Ms.'  THEN 4 
     WHEN sp.pers_salutation = 'PROF' THEN 6 
    END 
    ,sp.pers_dob 
    ,sp.pers_CreatedDate 
    ,sp.pers_UpdatedDate 
    ,'Candidate' 
    ,1 
    ,e.Emai_EmailAddress 
    ,sP.pers_personID 
FROM [db1].dbo.person sP 
LEFT JOIN [db1].dbo.PhoneLink sPL ON sp.pers_personID = sPL.PLink_recordID 
LEFT JOIN [db1].dbo.Phone sPH ON sPL.PLink_PhoneId = sPH.Phon_PhoneID 
LEFT JOIN [db1].dbo.EmailLink eL ON sP.pers_personID = eL.ELink_RecordID 
LEFT JOIN [db1].dbo.Email e ON eL.Elink_EmailID = e.Emai_EmailID 
WHERE 
    (
     sP.pers_employedby NOT IN (
      'Aspen' 
      ,'ACH' 
      ) 
     ) 
    OR 
     (
     sP.pers_employedby IN (
      'Aspen' 
      ,'ACH' 
      ) 
     AND sP.pers_personID NOT IN ( 
      SELECT c.oppo_PrimaryPersonID FROM [SageCRM].dbo.Opportunity c 
      WHERE (c.oppo_contractcompleted <= '2016-01-01' OR c.oppo_contractterminated <= '2016-01-01') and c.Oppo_Deleted is null) 
    AND 
     sp.pers_isanemployee != 'ECHO' 
     AND sP.pers_personID IN (
      SELECT c.oppo_PrimaryPersonID FROM [SageCRM].dbo.Opportunity c 
      WHERE c.oppo_Status != 'In Progress' OR c.oppo_Status = 'Completed') 
     AND sP.pers_dod IS NULL 
     AND sP.pers_FirstName NOT LIKE '%test%' 
     AND sP.pers_LastName NOT LIKE '%test%' 
     AND sp.pers_isanemployee != 'SalesContact' 
) 

В связи с тем, что каждый человек запись может иметь несколько телефонных номеров, связанных с ними, я в конечном итоге с несколькими записями для каждого человека, который, очевидно, привычка работа, так как в конце концов я получаю дубликаты, когда я действительно вставляю данные.

Проблема в том, что мне нужно иметь все номера телефонов для каждой записи, просто отображаемые в другом поле (домашний телефон, рабочий телефон, мобильный телефон).

Любые идеи, кроме этого, в отдельной инструкции вставки для каждой телефонной/электронной почты?

-------- РЕДАКТИРОВАТЬ: ------------------------------------ -----------------------------

Итак, я плохо знаю, что не дал вам достаточно информации. Оба ваших ответа были хорошими ответами, поэтому спасибо за это (@Horaciux, @John Wu).

Однако, нет столбец phoneType, только номер телефона. Тем не менее, поскольку каждый мобильный телефон начинается с 04 и каждого домашнего телефона с чем-либо еще, я могу довольно легко различать два типа телефона.

В телефоне есть дубликаты, поэтому мне придется удалить их, скорее всего, через CTE, не должно быть слишком сложно.

Итак, я в конечном итоге с чем-то вроде этого в течение двух телефонных номеров:

SELECT (phon_number FROM phone p INNER JOIN PhoneLink p1 on p1.PhoneLinkID = p.PhoneLink WHERE LEFT(p.Phon_Number, 2) = '04') 
SELECT (phon_number FROM phone p INNER JOIN PhoneLink p1 on p1.PhoneLinkID = p.PhoneLink WHERE LEFT(p.Phon_Number, 2) != '04') 

Мое удаление дубликатов будет что-то вроде этого:

WITH CTE AS 
(
    SELECT phon_linkID, phon_phonNumber, ROW_NUMBER() OVER (PARTITION BY phon_phonNumber ORDER BY phon_linkID) AS RN 
    FROM phone 
) 
DELETE FROM CTE WHERE RN<>1 
+0

Как классифицировать список телефонных номеров в различных областях (домашний телефон/рабочий телефон ..)? – ydoow

+0

Добавить структуру таблицы на ваш пост. Это возможно по-другому, если вы заботитесь о производительности. – Horaciux

ответ

2

Два простых шага.

  1. Избавьтесь от объединений к таблице номеров телефонов.

  2. Поиск номеров телефонов на запись с использованием подзапроса в предложении select, по одному для каждого типа телефона. Пример

    SELECT sP.pers_FirstName, 
         sP.pers_LastName, 
         (SELECT Phon_Number FROM Phone p JOIN PhoneLink pl ON pl.PhoneLinkID = p.PhoneLinkID WHERE pl.Person_ID = sP.pers_personID AND pl.Type = 'WORK') WorkPhone, 
         (SELECT Phon_Number FROM Phone p JOIN PhoneLink pl ON pl.PhoneLinkID = p.PhoneLinkID WHERE pl.Person_ID = sP.pers_personID AND pl.Type = 'HOME') HomePhone 
    FROM person 
    
2

Не зная структуру вашей таблицы, я сделаю несколько примеров.

select person.id, 
    max(case when phone.type='home' then phone.vlaue else 0 end) 'home', 
    max(case when phone.type='work' then phone.vlaue else 0 end) 'work' 
from person,phone where... 
group by person.id 

Затем использовать этот запрос, чтобы объединить все другие таблицы, необходимые

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

  • Нет связанных вопросов^_^