-2

タイトルに質問を言うのはちょっと難しいです。Usersという名前のテーブルがあり、「Id」という名前のID/主キー列があるとします。同じトランザクションで、かなり特定のWHERE句などに含まれるIdのインスタンスが1つだけであることがわかっているものを取得し、その直後に実行される非常に長いSELECTステートメントで繰り返しリサイクルするとします。これはSQLServerで実行できますか?基本的に私が避けようとしているのは次のようなものです。

Dim id As Int32 = DBA.OneTimeQuery("SELECT Id FROM users <where clause>").Rows(0)(0)
Return DBA.OneTimeQuery("SELECT <a lot of different things, involving multiple sub
    -selects that have to pull from the variable id>")
'DBA.OneTimeQuery returns a DataTable

最初のwhere句をリサイクルすることで、2つの異なる接続などの使用を回避できることはわかっていますが、同じ接続とトランザクションでさえ、まったく同じ情報を再検索し続けるのはかなり無駄です。

Sql ServerがId列からその単一の値を複数回検索することを避けたいです。また、同じSqlトランザクションと接続にそれを配置できるようにしたいです。これはどのように行うことができますか?ありがとう!

4

3 に答える 3

1

これは、ストアドプロシージャ内で実行できます。IDを変数に格納し、必要なときに使用します。

DECLARE @MyID int

SET @MyID = (SELECT SomeID FROM MyUsers WHERE ... )

--now use @MyID

SELECT Foo.Bar, Foo.Rascal FROM MyTable WHERE UserID = @MyID
于 2012-10-31T18:48:51.923 に答える
1

結合を実行できないのはなぜですか?

SELECT <Lengthy listing> 
FROM <Some Table> INNER JOIN Users 
ON <Some Property from Some table> = Users.Id 
WHERE <Your filter clause over the Users table>
于 2012-10-31T18:52:52.087 に答える
0

SQL変数に保存しますか?

最初に新しいレコードを挿入し、挿入されたIDを変数に格納し、残りのコード全体で変数を再利用するという、長いスクリプトを作成しました。

DECLARE @insertedID int;
INSERT INTO table1 ();

SET @insertedID = @@IDENTITY;

INSERT INTO table2 (table1ID) VALUES (@insertedID);
INSERT INTO table3 (table1ID) VALUES (@insertedID);

于 2012-10-31T18:49:13.540 に答える