如何在同一列中使用具有 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
尝试使用 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;
你想要的是这样的:
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
我正在尝试对几个 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
尝试使用 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;
你想要的是这样的:
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