2009-04-07 11 views
0

私は2つのテーブルの間に関係を持っています。 2つのテーブルPKはint型です。SQLサーバーでの動的SQL結合

1つのテーブル(UserS)では、ユーザー名を指定して対応するID(PK)を取得する必要があります。これは、フォーム認証を使用する場合の標準ASP.NETユーザーテーブルです。

しかし、関連するテーブルでは、値を取得するためにUsersテーブルから見つけたIDを指定します。

何かのように: - どこID =結果 取得値のユーザ名(単純なSELECT /クエリ)のためのIDを取得するために

実行クエリが ラン私は上記の結果を渡すことができますサブクエリを結果を返す

これは動的SQLとよく似ています。ただし、このクエリを記述するのに適した適切な方法があります(Sql Server 2k5)。

私はこれをやり遂げることができますし、何が問題になっていますか?

編集:私はhttp://www.sqlteam.com/article/introduction-to-dynamic-sql-part-1

EDITの線に沿って何かをしようとします:ヒント皆のためのおかげで、私はこれを書いた:ディスカウント INNER FROM

SELECT Discount.DiscountAmount をディスカウントON aspnet_Users を登録しよう。 DiscountCode = aspnet_Users.UserIdとaspnet_Users.Username = 's'

ここで、 's'はパラメータで置き換えられます。

ありがとう

+0

なぜ2つのテーブルを結合しないのですか?彼らは関連していますか? –

答えて

1

右、私はちょうどこれを行うだろう:参加する対のルックアップについて

SELECT * 
FROM TableB 
JOIN Users ON Users.Id = TableB.ID 
WHERE Users.Username = @Username 
2

動的SQLを使用する必要はありません。

あなたが代わりにルックアップを使用することができます

DECLARE @ID bigint 
SELECT @ID = ID FROM Users WHERE Username = @Username 

SELECT 
    * 
FROM 
    TableB 
WHERE 
    ID = @ID 

その後、あなたはSQLインジェクションのリスクを防止、あなたのSqlCommandオブジェクトにパラメータの@Usernameを追加することができます。

また、TableBの場合、索引が1回だけスキャンされるため、ルックアップを行う方がジョインよりも適しています。

+0

これはまさに私が動的SQLについて言及したときに考えていたことです。私はサブクエリを使うことができることを知っていましたが、それは構文/実装です。 :) – dotnetdev

0

これは単純な結合ではありませんか?

SELECT x.* 
FROM user_table u 
     INNER JOIN 
       other_table x 
       ON u.id = x.user_id 
WHERE u.name = @user_name 
0
SELECT values.value 
FROM form_users, values 
WHERE form_users.username = 'John Doe' 
     AND values.user = form_users.userid 
0
SELECT 
    * 
FROM 
    table2 t2 
    JOIN 
    UserS t1 ON t2.IDKey = t1.IDKey 
WHERE 
    UserS.Username = @Input 
1

- 初心者のルックアップを使用することが、より直感的に思えるかもしれないが、あなたが行く必要がありますジョインでジョインが一度評価される間、主結果セットのすべての行についてルックアップを評価する必要があります。結合ははるかに効率的です。つまり、結合が速くなります。