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' には null が含まれています。これらを一番下にしたいと思います。だから私はこれを行うとき:

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 BYORDER 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

最初の結果セットは列の別名で並べられ、2 番目の結果セットは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 に答える