2017-02-22 68 views
1

我试图从一个数据库插入数据到另一个数据库。这是我到目前为止,在选择方面: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 

然后使用该查询来加入你怎么分类的电话号码名单分成不同的领域需要