2012-02-17 12 views
0

私は3つのテーブルを持つDBを持っています。 ユーザーU_IDU_Name表、クラスC_ID、およびC_NameUser_Class U_IDC_ID表。外部キーが設定されます。VBでデータセットに格納された値にアクセスするには?

選択したユーザーに関連付けられたクラスを表示したいとします。ユーザーは名前で識別されます。私はこれらの知っている2つのSQL文は、私が実行する必要があります。その後、

SELECT U_ID FROM User WHERE U_Name = current_U_name 

SELECT C_ID FROM User_Class WHERE U_ID = current_U_ID 

その後、私はそれぞれの文の結果を格納するデータセットを使用していた

SELECT C_Name FROM Class WHERE C_ID = C_IDforAllMatchingRows 

が、データセットの1つの値にアクセスする方法を理解できませんでした。

(SELECT C_ID FROM User_Class WHERE U_ID = *dataset.Tables(0).Column(0)*) - 動作しません

私は上記のように各セルに格納されている値にアクセスできるので、私はgridviewsを使い始めました。

私はこれらの3つの単純なテーブルから必要な情報を取得する簡単な方法が欠落しているはずです。

すべてのヘルプは高く評価され、感謝

答えて

0

あなたは最終的にユーザーに基づいて、これを使用している場合は、なぜ、いくつかの共通点がある場合は3つのテーブルに参加して、要求されたフィールドを返すかない、ログイン。

SELECT C_NAME 
FROM CLASS AS A 
INNER JOIN 
(
    SELECT C_ID 
    FROM 
    USER_CLASS AS B 
    INNER JOIN 
    USER AS C 
    ON 
     B.U_ID = C.U_ID 
    WHERE 
     U_Name = current_U_name 
) AS D 
ON 
    A.C_ID = D.C_ID 

私はあなたの質問を理解して何から、それはあなたがこのクエリを実行する必要があり、クラスのリストを返すようにしようとしている学生のためのように思えます。それをデータテーブルに格納する場合は、linqまたはaをそれぞれ使用して、それぞれの行に出力することができます。

0

DataTable.Select()メソッドを見ましたか?それは少し長いったらしいですが、すべてのデータがデータ内に既に存在する場合は、のようなものを使用でき設定:。

Dim userRows As DataRow() = DataSet.Tables("User").Select(String.Format("WHERE U_Name = '{0}'", Current_User)) 
    If (userRows.Length = 0) Then 
     Throw New Exception("User Not Found") 
    End If 

    Dim UID As Int32 = Convert.ToInt32(userRows(0).Item(0)) 
    Dim userClassRows As DataRow() = DataSet.Tables("User_Class").Select(String.Format("WHERE U_ID = {0}", UID)) 

    If (userClassRows.Length = 0) Then 
     Throw New Exception("User Not Found") 
    End If 

    Dim classRows As New List(Of DataRow) 
    For i As Int32 = 0 To userClassRows.Length - 1 
     classRows.AddRange(DataSet.Tables("Class").Select(String.Format("WHERE C_ID = {0}", classRows(i).Item("C_ID")))) 
    Next 

    YourGridView.DataSource = classRows 

(私は主にので、私のVBに誤り/失言を言い訳してくださいC#]を使用してうまくいけば、論理は依然として従うことができる)。

各ユーザーのデータベースからの直接最後のクラスを取得しない正当な理由がない限り、以前の回答のように、私はSQLのアプローチを使用することになりますが:

SELECT * 
FROM Class 
WHERE C_ID IN 
     ( SELECT C_ID 
      FROM User_Class 
      WHERE U_ID IN (SELECT U_ID FROM user WHERE U_Name = @CurrentUser) 
     ) 

補遺

を@Aprillionは、おそらくより速いジョインについての良い点を挙げていますが、これは主に真ですが、C_IDとU_IDがUser_Classテーブルに一意に拘束されていないと仮定しているため、サブクエリにはDISTINCTまたはGROUP BYとなり、最適化がさらに進んでいきます。しかし、U_IDとC_IDがUser_Classで一意的に制約されている場合は、RDBMSに応じて結合を使用すると有益です。要約すると

Execution Plan in SQL Server

SQLのアプローチは、おそらく有益ですが、あなたが使用する必要があり、正確なSQLがあなたのRDBMS、データ構造、なインデックスとキーに依存します:SQL-Serverは、両方ほぼ正確に同じように最適化されます。前回の回答のように

0

、私は "選択したユーザーに関連付けられたクラス" を取得するために、単一のSQLクエリをお勧めします - しかし、joins should be faster than subqueries

query = "select c.c_name" & _ 
     " from user u" & _ 
     " join user_class uc on u.u_id = uc.u_id" & _ 
     " join class c on uc.c_id = c.c_id" & _ 
     " where u.u_name = '" & current_U_name & "'" 
0

私のお気に入りです:

query = "select c.c_name from user u, user_class uc, class c 
    where u.u_name = '" & current_U_name & "'" 
    and u.u_id = uc.u_id and uc.c_id = c.c_id 
関連する問題