2

SQL を数か月しか使用していませんが (この場所はこれまでのところ非常に役に立ちました。ありがとうございます!)、私は初心者の DB プログラマーですが、大きな結合がたくさんあることに気づきました。何度も何度も繰り返しています。一般的に使用される結合用のテーブル値関数を作成し、結果をフィルター処理するこの関数にパラメーターを渡すことを考えていました。

例えば。書く代わりに

SELECT * 
FROM T1 join T2 on T1.A = T2.A 
        join T3 on T2.B = T3.B
        join T4 on T3.C = T4.D
WHERE T1.D = '15' AND T2.D = '20' AND T3.C = '12'

私は書くだろう

SELECT * 
FROM dbo.SOME_FUNCTION(' T1.D = '15' AND T2.D = '20' AND T3.C = '12' ')

私の質問はこれだけです。これは私がやろうとすべきことですか?それとも、これをしたいのにとてつもなく怠惰ですか?

この関数を一日中研究/作成しようとしており、そうするのに多く/多くの問題がありました。最終的には、それを機能させることができる/機能することを知っていますが、時間をかける価値があるかどうか疑問に思っています。

PS: このサイトで最初に聞きたかった質問ではありませんが、この質問がばかげている場合は申し訳ありませんが、ここに行きます。

4

2 に答える 2

2

テーブル値関数は、反復的な SELECT ステートメントを回避するための優れた方法ですが、そうする唯一の方法ではありません。インデックスを作成できるため、ステートメントをビューに入れます。パラメーターを使用してビューからレコードを選択するテーブル値関数を引き続き使用できます。

ビューから次の 2 種類の取得があるとします。

1、SELECT ... WHERE Column1 = @p1

2、SELECT ... WHERE Column2 = @p2 AND Column3 = @p3

この場合、一致する 2 つのインデックスをビューに追加する必要があります。

  • 列 1

  • 列 2 + 列 3

于 2012-04-27T20:13:49.600 に答える
0

おそらくあなたの考えは正しいと思いますが、そのアプローチは理想的ではありません。これについては、おそらく2つの適切な方法があります。最初に VIEW を作成します。

CREATE VIEW dbo.SOME_VIEW AS
(
    SELECT 
        -- [list out the columns here], do not use *
    FROM 
        T1 
    JOIN 
        T2 on T1.A = T2.A 
    JOIN 
        T3 on T2.B = T3.B
    JOIN 
        T4 on T3.C = T4.D
)

それで、クエリは次のとおりです。

SELECT * FROM SOME_VIEW
WHERE ...

関数のアプローチは機能する可能性がありますが、例で示した単一の文字列のアプローチではなく、3つのパラメーターを受け入れるように関数を変更して、代わりにこれを行うようにします。

SELECT * FROM dbo.SOME_FUNCTION('15', '20', '12')

同様に、データへのアクセス方法によっては、ストアド プロシージャの方が適切な場合があります。

EXEC dbo.spSomeStoredProcedure @T1D = '15', @T2D = '20', @T3C = '12'

編集:テーブル値関数とストアド プロシージャの両方で、上記のビューを利用する必要があります。

于 2012-04-27T20:12:50.430 に答える