假设我们有一个表Users
来存储有关用户的基本信息
UserId FirstName LastName
1 Maria Anders
2 Ana Trujillo
3 Antonio Moreno
4 Thomas Hardy
5 Christina Berglund
6 Hanna Moos
7 Frédérique Citeaux
8 Martín Sommer
我们有两个表Details
和Exception
,用于存储有关用户的其他详细信息,实际上两个表都具有相同的结构
Details
表
UserId Age
1 10
2 10
3 10
4 40
5 50
6 60
7 70
8 80
Excpetions
表
UserId Age
1 100
2 100
3 100
我想编写查询以从Exceptions
和details
获取有关用户的所有详细信息,如果用户的信息存储在exceptions
表中,则应覆盖details
表中存储的数据1}}表以其他方式从details
表中获取数据
所以结果应该是
UserId FirstName LastName Age
1 Maria Anders 100
2 Ana Trujillo 100
3 Antonio Moreno 100
4 Thomas Hardy 40
5 Christina Berglund 50
6 Hanna Moos 60
7 Frédérique Citeaux 70
8 Martín Sommer 80
所以在这个例子中,Maria,Ana和Antonio与Ids 1,2,3在details
表中的年龄为10岁但是因为他们的数据存储在excpetions
表中,结果应该显示为100岁,其他用户没有excpetion
表中的信息,所以我们只是从details
表中获取数据。
实际上,我提出了一个解决方案,但我认为我可以编写更好的查询,这是我的解决方案
select u.UserId, u.FirstName , u.LastName , e.Age from Exceptions e
inner join Users u on u.UserId = e.UserId
union select u.UserId, u.FirstName , u.LastName , d.Age from Details d
inner join Users u on u.UserId = d.UserId
where d.UserId not in ( select UserId from Exceptions )
有没有办法避免这个子查询?我们可以做得更好吗?
答案 0 :(得分:4)
您可以使用左连接的piar和CASE WHEN(或检查null)
select
u.UserId
, u.FirstName
, u.LastName
, CASE WHEN e.Age IS NOT NULL then e.age ELSE d.age END as AGE
from Users u
left join Details as d on .UserId = d.UserId
left join Exceptions e on e.UserId = u.UserId
答案 1 :(得分:2)
我没有使用CASE语句,而是使用COALESCE。
select
u.UserId
, u.FirstName
,COALESCE(e.Age,d.age) AGE
from Users u
left join Details as d on u.UserId = d.UserId
left join Exceptions e on e.UserId = u.UserId