我是SQL新手,需要一些帮助。
我的SQL Server 2008数据库中有3个表。在每个表中有不同类型的用户(同事,学生,教师)。他们都有昵称。还有一个包含所有用户的表格。
我想将所有这些连接到一个表中,其中一列名为nickname。在本专栏中,三种不同类型的用户应该按照这样的包装进行排序,而不管他们的昵称是什么:
coworker1 coworker2 coworker2 student1 student2 student3 teacher1 teacher2
我尝试了以下方式:
SELECT A.Nickname, B.Nickname, C.Nickname, D.Nickname
FROM users AS A LEFT OUTER JOIN coworkers AS B ON
A.Nickname = B.Nickname
LEFT OUTER JOIN teachers AS C ON
A.Nickname = C.Nickname
LEFT OUTER JOIN students AS D ON
A.Nickname = D.Nickname
那根本不起作用,给我一个包含4列的表,每列都有NULL和未排序的用户
感谢HABO,我为它做了这件事:
select Nickname from (
SELECT Coalesce( B.Nickname, C.Nickname, D.Nickname, A.Nickname ) as Nickname,
case
when B.Nickname is not NULL then 1
when C.Nickname is not NULL then 3
when D.Nickname is not NULL then 2
else 0 end as Package
FROM users AS A LEFT OUTER JOIN coworkers AS B ON
A.Nickname = B.Nickname
LEFT OUTER JOIN teachers AS C ON
A.Nickname = C.Nickname
LEFT OUTER JOIN students AS D ON
A.Nickname = D.Nickname ) as Elmer
order by Package, Nickname
答案 0 :(得分:1)
听起来你只能union
和order
三个用户类型表,而不是做一堆连接。
尝试这样的事情:
SELECT s.nickname nickname, ..., 'student' type FROM students s
UNION
SELECT t.nickname nickname, ..., 'teacher' type FROM teachers t
UNION
...
ORDER BY type;
这更接近你想要完成的事情吗?
答案 1 :(得分:0)
如果您只想要非NULL列输出:
SELECT Coalesce( B.Nickname, C.Nickname, D.Nickname, A.Nickname ) as Nickname
FROM users AS A LEFT OUTER JOIN coworkers AS B ON
A.Nickname = B.Nickname
LEFT OUTER JOIN teachers AS C ON
A.Nickname = C.Nickname
LEFT OUTER JOIN students AS D ON
A.Nickname = D.Nickname
请注意,已重新排列列,以便users
中的昵称是最后一个选择。
关于分拣包裹的评论我不清楚。你的意思是这样的:
select Nickname from (
SELECT Coalesce( B.Nickname, C.Nickname, D.Nickname, A.Nickname ) as Nickname,
case
when B.Nickname is not NULL then 1
when C.Nickname is not NULL then 3
when D.Nickname is not NULL then 2
else 0 end as Package
FROM users AS A LEFT OUTER JOIN coworkers AS B ON
A.Nickname = B.Nickname
LEFT OUTER JOIN teachers AS C ON
A.Nickname = C.Nickname
LEFT OUTER JOIN students AS D ON
A.Nickname = D.Nickname ) as Elmer
order by Package, Nickname