1

私が取り組んでいる典型的なストアドプロシージャでは、以下と同じクエリでさまざまなチェックがあります。

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM Tasks)

(SELECT ProjectId FROM Tasks)クエリを aに置き換えたいのvariableですが、どうすればよいか混乱していdatatypeます。知っていますか?また、この結果をキャッシュすることは有害であるか、これを行うためのより簡単な方法があります。

4

2 に答える 2

1

この形式が望ましいです (ただし、オプティマイザーはこの最適化を実行する必要があります)。

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId

次に、条件を WHERE 句として追加します (内部選択を実行して ProjectId のリストを変数に配置しようとする代わりに):

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId
WHERE someCondtionOnTasksTable
于 2012-01-19T07:04:52.843 に答える
1

次のように、テーブル型の変数を作成して複数回使用できます。

CREATE @Projects TABLE(Id INT NOT NULL)

INSERT @Projects SELECT ProjectId FROM Tasks

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM @Projects)
SELECT ... FROM Projects WHERE ProjectId NOT IN (SELECT ProjectId FROM @Projects)

ただし、クエリを変数に置き換えるのではなく、サブクエリの結果をより再利用可能にします

しかし

特定の条件下では、クエリのパフォーマンスが低下する可能性があります

于 2012-01-19T07:28:40.030 に答える