1

虽然这种技术对标准列很有效,但我遇到了一些我不明白的事情。我正在重写查询中的结果以用于报告目的,并且需要按别名列“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

我得到“无效的列名'PARENT'。

有任何想法吗?(对 SQL 来说还是很新的东西!)

4

2 回答 2

3

SQL Server 不允许您在查询中的其他地方使用列别名,除了ORDER BY子句中(但不是在 内的表达式中ORDER BY,因此您必须重新键入原始列定义。有关对此的更深入解释(比我能给出的要好得多),请参阅此页面

试试这个:

ORDER by MODULE_ID
   , case when COALESCE(fun.parent_function, fun2.function_id) is null then 1 else 0 end
   , FUNCTION_ID
于 2012-12-14T21:54:52.707 回答
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 
于 2012-12-14T22:23:08.997 回答