将多行上的SQL连接到单行

将多行上的SQL连接到单行,sql,sql-server-2008,Sql,Sql Server 2008,我正在努力以我需要的方式进行连接,我有两个表,其中包含我需要链接的数据(只是为了清楚起见)。一个表保存出站呼叫数据、已拨号码、持续时间等。另一个表包含所拨打电话的联系人的详细信息。详情如下: CustID | Number 1 | Number 2 | Number 3 | Number 4 1 | 072454584 | | 017726593 | 2 | |0125456852| | 0125785448

我正在努力以我需要的方式进行连接,我有两个表,其中包含我需要链接的数据(只是为了清楚起见)。一个表保存出站呼叫数据、已拨号码、持续时间等。另一个表包含所拨打电话的联系人的详细信息。详情如下:

CustID | Number 1  | Number 2 | Number 3  | Number 4
    1  | 072454584 |          | 017726593 | 
    2  |           |0125456852|           | 0125785448
因此,如果我们想打电话给客户1,我们会尝试两个号码,只有一个连接


我需要做的是将拨打的号码加入到客户记录中,这样它会比较每个号码,直到匹配为止(希望这是有意义的)。我尝试了一个
案例,但它不起作用。做这件事最好的方法是什么

我可能会采用这种方法进行查询

with myphones
AS
(
    SELECT CustomerId, Phone1 As Phone FROM ContactDetails
    UNION
    SELECT CustomerId, Phone2 As Phone FROM ContactDetails
    UNION
    SELECT CustomerId, Phone3 As Phone FROM ContactDetails
    UNION
    SELECT CustomerId, Phone4 As Phone FROM ContactDetails
)
SELECT p.CustomerId, p.Phone, oc.*
FROM myphones p 
    INNER JOIN outboundcalls oc ON p.Phone = oc.Phone

我可能会采用这种方法来进行查询

with myphones
AS
(
    SELECT CustomerId, Phone1 As Phone FROM ContactDetails
    UNION
    SELECT CustomerId, Phone2 As Phone FROM ContactDetails
    UNION
    SELECT CustomerId, Phone3 As Phone FROM ContactDetails
    UNION
    SELECT CustomerId, Phone4 As Phone FROM ContactDetails
)
SELECT p.CustomerId, p.Phone, oc.*
FROM myphones p 
    INNER JOIN outboundcalls oc ON p.Phone = oc.Phone

您希望将一系列左外部联接与匹配上的条件语句一起使用:

select cd.CustId,
       coalesce(oc1.number, oc2.number, oc3.number, oc4.number) as MatchingNumber,
       (case when oc1.Number is not null then 'Number1'
             when oc2.Number is not null then 'Number2'
             when oc3.Number is not null then 'Number3'
             when oc4.Number is not null then 'Number4'
        end) as WhichMatch
from ContactDetails cd left outer join
     OutboundCalls oc1
     on cd.number1 = oc1.number left outer join
     OutboundCalls oc2
     on cd.number2 = oc2.number left outer join
     OutboundCalls oc3
     on cd.number3 = oc3.number left outer join
     OutboundCalls oc4
     on cd.number4 = oc4.number;
左侧外部联接尝试与列表中的每个数字匹配。
coalesce()
将选择第一个匹配的数字,
大小写告诉您哪个数字匹配


请注意,如果您对给定客户有多个成功的出站调用,则输出中将有多行。

您希望在匹配上使用一系列带条件语句的左外部联接:

select cd.CustId,
       coalesce(oc1.number, oc2.number, oc3.number, oc4.number) as MatchingNumber,
       (case when oc1.Number is not null then 'Number1'
             when oc2.Number is not null then 'Number2'
             when oc3.Number is not null then 'Number3'
             when oc4.Number is not null then 'Number4'
        end) as WhichMatch
from ContactDetails cd left outer join
     OutboundCalls oc1
     on cd.number1 = oc1.number left outer join
     OutboundCalls oc2
     on cd.number2 = oc2.number left outer join
     OutboundCalls oc3
     on cd.number3 = oc3.number left outer join
     OutboundCalls oc4
     on cd.number4 = oc4.number;
左侧外部联接尝试与列表中的每个数字匹配。
coalesce()
将选择第一个匹配的数字,
大小写告诉您哪个数字匹配

请注意,如果您对给定客户有多个成功的出站呼叫,则输出中将有多行