jue*_*n d 20 sql conditional join sql-server-2008
我想知道用户是否在2个相关表中的任何一个中都有一个条目.
表
USER (user_id)
EMPLOYEE (id, user_id)
STUDENT (id, user_id)
Run Code Online (Sandbox Code Playgroud)
用户可以拥有员工和/或学生条目.如何在一个查询中获取该信息?我试过了:
select * from [user] u
inner join employee e
on e.user_id = case when e.user_id is not NULL
then u.user_id
else null
end
inner join student s
on s.user_id = case when s.user_id is not NULL
then u.user_id
else null
end
Run Code Online (Sandbox Code Playgroud)
但它只会返回两个表中都有条目的用户.
ben*_*y23 21
您可以使用外部联接:
select *
from USER u
left outer join EMPLOYEE e ON u.user_id = e.user_id
left outer join STUDENT s ON u.user_id = s.user_id
where s.user_id is not null or e.user_id is not null
Run Code Online (Sandbox Code Playgroud)
或者(如果您对EMPLOYEE或STUDENT表中的数据不感兴趣)
select *
from USER u
where exists (select 1 from EMPLOYEE e where e.user_id = u.user_id)
or exists (select 1 from STUDENT s where s.user_id = u.user_id)
Run Code Online (Sandbox Code Playgroud)
小智 8
如果您想要将所有用户数据放在一起您可能拥有:
SELECT
user_id
,'Employee' AS Source
FROM
employee
UNION
SELECT
user_id
,'Student' AS Source
FROM
student
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!3/90216/22
这也可以使用完整连接和CASE语句来完成:
SELECT
ISNULL(e.user_id,s.user_id) AS user_id
,CASE WHEN e.user_id IS NULL THEN 'Student'
ELSE 'Employee'
END AS SOURCE
FROM
employee AS e
FULL JOIN student AS s
ON s.user_id = e.user_id
Run Code Online (Sandbox Code Playgroud)
http://sqlfiddle.com/#!3/90216/29
后者将把同时兼顾员工的人员组合成一排,并称他们为员工.相比:
http://sqlfiddle.com/#!3/2aa3e/1 和 http://sqlfiddle.com/#!3/2aa3e/2
我已经让用户1成为学生和员工
如果将员工表和学生表视为一个表,则可以使用左连接:
select *
from user u
left join
(
select 'Employee' as UserType,
id,
user_id
from employee e
union all
select 'Student',
id,
user_id
from student s
) r
ON u.user_id = r.user_id
Run Code Online (Sandbox Code Playgroud)
这样的解决方案也可以为您提供帮助。
SELECT S.*, P.*
,CASE
WHEN S.ShipmentType = 'import' THEN SP.SupplierName
WHEN S.ShipmentType = 'export' THEN C.CustomerName
END AS ShipmentDesination
FROM tblShippments S
INNER JOIN tblProducts P ON S.productId = P.productID
LEFT OUTER JOIN tblCustomers C ON S.companyId = C.customerId AND S.ShipmentType = 'export'
LEFT OUTER JOIN tblSuppliers SP ON S.companyId = SP.supplierId AND S.ShipmentType = 'import'
Run Code Online (Sandbox Code Playgroud)