虽然this technique适用于标准列,但我遇到了一些我不理解的问题。我在我的查询中重写结果用于报告目的,需要按别名列'PARENT'排序,如下所示:
select fun.MODULE_ID
, fun.FUNCTION_ID
, COALESCE(fun.parent_function, fun2.function_id) as PARENT
, fun.DESCRIPTION
, fun.FUNCTION_PURPOSE
from MODULE_FUNCTION fun
LEFT JOIN MODULE_FUNCTION fun2
ON fun.function_id = fun2.function_id
AND fun2.function_id IN (SELECT parent_function FROM MODULE_FUNCTION)
ORDER BY MODULE_ID
, PARENT
, FUNCTION_ID
这很好用,但我的专栏'PARENT_FUNCTION'及其别名'PARENT'包含空值。我希望这些是在底部。所以当我这样做时:
ORDER BY MODULE_ID
, case when PARENT is null then 1 else 0 end, PARENT
, FUNCTION_ID
我收到“无效的列名'父母'。”
有什么想法吗? (对SQL来说还是非常新的!)
答案 0 :(得分:3)
SQL Server不允许您在ORDER BY
子句中的除之外的其他地方使用列别名(但不在ORDER BY
中的表达式中) ,因此您必须重新键入原始列定义。有关此问题的更深入解释(比我能给出的要好得多),请参阅this page
试试这个:
ORDER by MODULE_ID
, case when COALESCE(fun.parent_function, fun2.function_id) is null then 1 else 0 end
, FUNCTION_ID
答案 1 :(得分:3)
在ORDER BY
子句中使用列别名时,它只能单独使用。如果您尝试在表达式中使用它,SQL Server将尝试将其解析为其中一个基表中的列。
例如
DECLARE @T TABLE(X INT, Y int)
INSERT INTO @T
VALUES (1,3),(2,2),(3,1)
SELECT X AS Y
FROM @T
ORDER BY Y
Y
-----------
1
2
3
SELECT X AS Y
FROM @T
ORDER BY Y + 0
Y
-----------
3
2
1
第一个结果集由列别名排序,第二个结果集由基表中的列Y
排序。
您可以像在另一个答案中一样重复基础表达式,也可以使用派生表/ cte来投影列,然后可以在order by
的表达式中使用该投影列
;WITH CTE
AS (SELECT fun.MODULE_ID,
fun.FUNCTION_ID,
COALESCE(fun.parent_function, fun2.function_id) AS PARENT,
fun.DESCRIPTION,
fun.FUNCTION_PURPOSE
FROM MODULE_FUNCTION fun
LEFT JOIN MODULE_FUNCTION fun2
ON fun.function_id = fun2.function_id
AND fun2.function_id IN (SELECT parent_function
FROM MODULE_FUNCTION))
SELECT *
FROM CTE
ORDER BY MODULE_ID,
CASE
WHEN PARENT IS NULL THEN 1
ELSE 0
END,
PARENT,
FUNCTION_ID