1

関数の1つでSQLロジックを最適化するための支援が必要です。ストアドプロシージャは使用できませんのでご注意ください。

これが私のテーブルです。多くのレコードを含む@MainTableを使用して初期化されます。

DECLARE TABLE @ResultTable
(
    ResultValue INT
)

これらはいくつかのパラメータを格納するテーブルです-それらも空にすることができます。

DECLARE TABLE @ParameterOne (ParameterOne INT)
DECLARE TABLE @ParameterTwo (ParameterOne NVARCHAR(100))
...
DECLARE TABLE @ParameterN(ParameterN TINYINT)

ここで、@ MainTableからいくつかのレコードのみを選択するために、多くのテーブルを@MainTableに結合する必要があります。選択されるレコードは、パラメータテーブルに保存されている情報によって異なります。

だから、私の現在の解決策は次のとおりです。

INSERT INTO  ResultTable(ResultValue)
SELECT ResultValue 
FROM MainTable M
INNER JOIN @MainOne MO
    ON M.ID=MO.ID
....
INNER JOIN @MainN MN
    ON M.IDN=MN.ID
WHERE (EXISTS (SELECT 1 FROM @ParameterOne WHERE ParameterOne=MO.ID) OR NOT EXISTS (SELECT 1 FROM @ParameterOne))
       AND 
      ...
       AND
      (EXISTS (SELECT 1 FROM @ParameterN WHERE ParameterN=MN.Name) OR NOT EXISTS (SELECT 1 FROM @ParameterN ))

したがって、パラメータテーブルの現在の基準に一致する場合にのみレコードを追加するという考え方です。

プロシージャを使用して動的クエリを作成できないため、パラメータテーブルごとにEXISTSとNOTEXISTSの組み合わせでWHERE句を使用しています。

問題は、パラメータテーブルを追加するときに動作が遅くなることです。どのパラメータテーブルにレコードがあるかをチェックする多くのIF/ELSEステートメントを使用せずにこれを行う他の方法はありますか?それは関数をはるかに大きくし、読み取りを困難にします。

そして、アイデアやアドバイスを歓迎します。

4

1 に答える 1

1

良い質問。

次のいずれかを試してください。

INSERT INTO  ResultTable(ResultValue)
SELECT ResultValue 
FROM MainTable M
INNER JOIN (SELECT * FROM @MainOne WHERE (EXISTS (SELECT 1 FROM @ParameterOne WHERE ParameterOne=@MainOne.ID) OR NOT EXISTS (SELECT 1 FROM @ParameterOne))) MO
    ON M.ID=MO.ID
....
INNER JOIN (SELECT * FROM @MainN WHERE (EXISTS (SELECT 1 FROM @ParameterN WHERE ParameterOne=@MainN.Name OR NOT EXISTS (SELECT 1 FROM @ParameterN))) MO
    ON M.IDN=MN.ID

利点:

  1. JOINの結果は、すべてのデータを処理するわけではないため、より迅速になります(すでにフィルター処理されています)
  2. 調整がより簡単に見えます
于 2013-01-28T15:07:18.667 に答える