如何在同一列中使用具有 2 个条件的内部联接

How to use a inner join with 2 conditions in the same column

我正在尝试对几个 table 进行 INNER JOIN,但有特定条件:

我有联系人 table:

code                contact_type                  name               email
----------------------------------------------------------------------------
1                       P                       AAAAAAAA            SSSS@DDD.COM
2                       P                        BBBBBBB             SDFSDF@DDD.COM
3                       P                         CCCCC              SDSDF@DD.COM
1                       C                        AAAABBB             DDDD@DDD.COM
2                       C                        BBBBCCC             DSDF@DD.COM
3                       C                        CCCCDDD             ASSAD@DD.COM

供应商table:

code                               name
----------------------------------------------------
1                                  SIEMENS
2                                  FUJITSU
3                                  ASUS

和客户table:

CODE                                     NAME
---------------------------------------------------------
1                                       SMITH
2                                       PETER
3                                       MICHAEL

我喜欢 select 联系人中的所有行,但是当 CONTACT_TYPE 为 C 时,此代码对应 CLIENT.name,而当 [=41] =]是P出现通讯员PROVIDER.NAME,

我试试:

SELECT code,contact_type,con.name,con.EMAIL 
FROM contacts con 
  inner join CLIENTS cli 
    on cli.codcli=con.CODE 
   and con.CONTACT_TYPE='C'
  inner join provIDERS p 
     on con.CODE=p.codpro 
    and con.CONTACT_TYPE='P' 

但是不起作用,

我也试试: [SQL Fiddle Demo]

我想看到这样的:

PROVIDER/CLIENT NAME            CONTACT_TYPE                      EMAIL
---------------------------------------------------------------------------
SIEMENS                             P                          SSSS@DDD.COM
FUJITSU                             P                          SDFSDF@DDD.COM 
ASUS                                P                          SDSDF@DD.COM
SMITH                               C                          DDDD@DDD.COM
PETER                               C                          DSDF@DD.COM
MICHAEL                             C                          ASSAD@DD.COM

[SQL Fiddle Demo]

尝试使用 left join:

SELECT code, contact_type, con.name, con.EMAIL 
FROM contacts con left join
     CLIENTS cli
     on cli.codcli =c on.CODE and
        con.CONTACT_TYPE = 'C' left join
     providers p 
     on con.CODE = p.codpro and
        con.CONTACT_TYPE = 'P' ;

inner join 要求每一行同时匹配两个 表。鉴于条件,这显然是不可能的。所以,使用 left join.

对于您的实际结果:

SELECT coalesce(con.name, p.name) as name, cli.contact_type, cli.email 
FROM contacts con left join
     CLIENTS cli
     on cli.codcli = con.CODE and
        con.CONTACT_TYPE = 'C' left join
     providers p 
     on con.CODE = p.codpro and
        con.CONTACT_TYPE = 'P' ;

我建议你使用这个查询:

SELECT 
    CASE 
        WHEN CONTACT_TYPE = 'C' THEN
            (SELECT Name FROM CLIENTS c WHERE c.Code = co.Code)
        WHEN CONTACT_TYPE = 'P' THEN
            (SELECT Name FROM PROVIDERS p WHERE p.Code = co.Code)
    END AS [PROVIDER/CLIENT NAME],
    CONTACT_TYPE, EMAIL
FROM
    CONTACTS co;

[SQL Fiddle Demo]

你想要的是这样的:

SELECT CASE WHEN C.ContactType = 'P' THEN P.Name,
        WHEN C.ContactType = 'C' THEN C.Name,
        ELSE 'Unknown' END AS ProviderClientName,
        C.ContactType,
        C.Name
FROM CONTACTS C WITH(NOLOCK)
LEFT JOIN CLIENTS CL WITH(NOLOCK) ON C.Code = CL.Code
LEFT JOIN PROVIDERS P WITH(NOLOCK) ON C.Code = P.Code

但是请检查您的数据,因为您的示例中的 Contacts 和 Clients 表之间的连接不会 return 匹配。

你可以尝试用union来做:

SELECT  p.Name AS [Provider/Client Name] ,
        c.Contact_Type ,
        c.Email
FROM    contacts c
        INNER JOIN providers p
        ON c.code = p.code
WHERE  c.Contact_Type = 'P'
UNION
SELECT  cl.Name AS [Provider/Client Name] ,
        c.Contact_Type ,
        c.Email
FROM    contacts c
        INNER JOIN client cl
        ON  cl.code = p.code
WHERE   c.Contact_Type = 'C'

或通过用例语句:

SELECT  CASE
        WHEN c.Contact_Type = 'P' THEN 
            (SELECT p.Name FROM providers p WHERE p.code = c.code)
        ELSE 
            (SELECT cl.Name FROM client cl WHERE cl.code = c.code) END
        AS [Provider/Client Name] ,
        c.Contact_Type ,
        c.Email
FROM    contacts c