在一列中加入3个表并对其进行排序

时间:2013-11-19 17:53:50

标签: sql sql-server join

我是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

2 个答案:

答案 0 :(得分:1)

听起来你只能unionorder三个用户类型表,而不是做一堆连接。

尝试这样的事情:

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