1

前の列で選択された関数の戻り値を渡し、同じ行の次の関数にパラメーターとして渡す必要があります。エイリアスを使用できません:

私がしたいのは:

SELECT
    dbo.GetSecondID(f.ID) as SecondID,
    dbo.GetThirdID(SecondID) as ThirdID
FROM Foo f

回避策はありますか?ありがとうございました!

編集:

メソッドdbo.GetSecondID()は非常に重く、テーブル内の数百万のレコードを扱っています。メソッドをパラメーターとして渡すのは賢明ではありません。

4

3 に答える 3

3

SQL の設計方法は、(理論上) すべての列を並列に計算できるようにすることを目的としています。これは、 1 つの列の値を別の列 (同じ節内) の計算結果に依存させることができないことを意味します。SELECT

列を参照できるようにするために、サブクエリを導入できます。

SELECT SecondID,dbo.GetThirdID(SecondID) as ThirdID
FROM
(
    SELECT
        dbo.GetSecondID(f.ID) as SecondID   
    FROM Foo f
) t

または CTE:

;WITH Results1 AS (
    SELECT
        dbo.GetSecondID(f.ID) as SecondID   
    FROM Foo f
)
SELECT SecondID,dbo.GetThirdID(SecondID) as ThirdID
FROM Results1

複数回計算を構築している場合 (たとえば、A は B に依存し、B は C に依存し、C は D に依存します...)、CTE フォームは通常、よりきれいに見えます (IMO)。

于 2012-11-09T11:36:50.807 に答える
1

ビンゴ!を適用する際の秘密のスタンドCROSS APPLY。次のコードは役に立ちました

SELECT
    sndID.SecondID,
    dbo.GetThirdID(sndID.SecondID) as ThirdID
FROM Foo f
CROSS APPLY
(
    SELECT dbo.GetSecondID(f.ID) as SecondID
) sndID

編集:

これは、SecondIDが一意である (1 つのレコードのみが返される) かGROUP BY、使用されている場合にのみ機能します。

于 2012-11-09T15:04:09.027 に答える
0

これを意味しましたか:

SELECT
     dbo.GetThirdID(dbo.GetSecondID(f.ID)) as ThirdID
FROM Foo f
于 2012-11-09T11:19:06.263 に答える