将两列合并为一列,但不是同一单元格,并将其分类

She*_*iad 0 sql sql-server stored-procedures

我有两个表,用于级别(管理员,主持人,代理等)的“表A”和用于用户的“表B”,其中一列表示引用“表A”的级别ID。我希望存储过程将用户名归类,但结果必须在这样的一列中:

那是我的两张桌子:

TableA
+---------------------------+
|Level ID     |Level Name   |
+---------------------------+
|1            |Admin        |
+---------------------------+
|2            |Moderator    |
+---------------------------+
|3            |Agent        |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)
TableB
+---------------------------+
|Username     |Level ID     |
+---------------------------+
|John         |1            |
+---------------------------+
|Sam          |2            |
+---------------------------+
|Tommy        |2            |
+---------------------------+
|Tony         |3            |
+---------------------------+
|Patrick      |3            |
+---------------------------+
|Jimmy        |3            |
+---------------------------+
|Tod          |3            |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)

这就是我想要查询结果的方式:

+-------------+
|Admin        |
+-------------+
|  John       |
+-------------+
|             |
+-------------+
|Moderator    |
+-------------+
|  Sam        |
+-------------+
|  Tommy      |
+-------------+
|             |
+-------------+
|Agent        |
+-------------+
|  Tony       |
+-------------+
|  Patrick    |
+-------------+
|  Jimmy      |
+-------------+
|  Tod        |
+-------------+
Run Code Online (Sandbox Code Playgroud)

它只能是一列,并且可以在名称前添加空格

CONCAT(' ', TableA.Username)
Run Code Online (Sandbox Code Playgroud)

每个级别类别中姓氏后面都有一个空白单元格。我正在使用SQL Management Studio 18

Gor*_*off 5

使用union allorder by

select name
from ((select levelname as name, levelid, 1 as ord
       from tablea
      ) union all
      (select '  ' + username, levelid, 2 as ord
       from tableb
      )
     ) ul
order by levelid, ord;
Run Code Online (Sandbox Code Playgroud)

这实际上不包括空白行,您还可以包括:

select name
from ((select levelname as name, levelid, 1 as ord
       from tablea
      ) union all
      (select '  ' + username, levelid, 2 as ord
       from tableb
      ) union all
      (select null, levelid, 0 as ord
       from tablea
       where levelid > 1
      )
     ) ul
order by levelid, ord;
Run Code Online (Sandbox Code Playgroud)

所有这些。您可以在SQL中进行此转换。但是,在应用程序层中进行此类格式化更为典型。