我有以下select语句,我试图以特定的方式排序我的结果,特别是部门的层次结构。但是,当我添加案例时,我的ORDER BY停止工作并给我一个错误:
如果语句包含UNION,INTERSECT或EXCEPT运算符,则ORDER BY项必须出现在选择列表中。
我不知道为什么会这样,因为我在每个SELECT语句中选择all。
Select * FROM AccountAdminTable Where CollegeCode = 'A10' AND AdminLevel LIKE 'Account Administrator'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A10' AND AdminLevel LIKE 'Department Head/Director'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A10' AND AdminLevel LIKE 'Dean/Vice President'
Order By AdminLevel ASC
这不起作用:
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Account Administrator'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Department Head/Director'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Dean/Vice President'
Order By Case
When AdminLevel = 'Account Administrator' Then 1
When AdminLevel = 'Department Head/Director' Then 2
When AdminLevel = 'Dean/Vice President' Then 3
Else 4 End ASC
任何帮助是极大的赞赏!以下是一些示例数据。
College Code| AdminLevel | Name
A | Account Administrator | Bob
A | Department Head/Director | Tim
A | Dean/Vice President | Jeff
B | Account Administrator | Gary
B | Department Head/Director | Phil
B | Dean/Vice President | John
C | Account Administrator | Bill
C | Account Administrator | Larry
你有2个选择:
SELECT *
FROM(
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Account Administrator'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Department Head/Director'
Union
Select * FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Dean/Vice President'
)t
Order By Case
When AdminLevel = 'Account Administrator' Then 1
When AdminLevel = 'Department Head/Director' Then 2
When AdminLevel = 'Dean/Vice President' Then 3
Else 4 End ASC;
*或添加定义订单的列。
Select *, 1 AS OrderCol FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Account Administrator'
Union
Select *, 2 AS OrderCol FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Department Head/Director'
Union
Select *, 3 AS OrderCol FROM AccountAdminTable Where CollegeCode = 'A' AND AdminLevel LIKE 'Dean/Vice President'
Order By OrderCol;
无论哪种方式,您可能希望将UNION更改为UNION ALL以提高性能。除非你真的消除重复。
你知道,你真的根本不需要使用UNION。由于您的所有SELECTS都来自同一个表,您可以这样做(注意,下面我的伪代码中使用的缩写。显然,在代码中使用正确的值):
Select * FROM AccountAdminTable
Where CollegeCode = 'A'
AND AdminLevel IN ('Account Administrator','Dept HD','Dean/VP')
ORDER BY CASE {Your CASE Expression}
编写查询的另一个选项是:
SELECT AccountAdminTable.*
FROM AccountAdminTable
INNER JOIN (VALUES
(1, 'Account Administrator'),
(2, 'Dept HD'),
(3, 'Dean/VP')
) AS vlist(Sort, AdminLevel) ON AccountAdminTable.AdminLevel = vlist.AdminLevel
WHERE CollegeCode = 'A'
ORDER BY vlist.Sort
或者更好的是,为管理级别创建一个表并通过外键引用它。