所以我有一个包含3个表的数据库。 用户包含U_ID
和U_Name
,类 C_ID
,C_Name
和 User_Class 包含U_ID
和C_ID
的表格。外键已设置。
我想显示与所选用户关联的类。用户通过其姓名进行标识。我知道这些是我需要执行的两个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
我想使用数据集来存储每个语句的结果,但我无法弄清楚如何访问数据集中的一个值,即
(SELECT C_ID FROM User_Class WHERE U_ID = *dataset.Tables(0).Column(0)*)
- 无效
我开始使用gridviews,因为我可以像上面那样访问存储在每个单元格中的值。
我必须错过一种从这三个简单表中检索所需信息的简单方法。
感谢任何帮助,谢谢
答案 0 :(得分:0)
如果您最终根据登录的用户使用此功能,为什么不在三个表上进行连接(如果存在某些共性)并返回请求的字段。
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 for each并输出每一行,如果这是您尝试使用它。
答案 1 :(得分: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
(我主要使用C#,所以请原谅我的VB中的任何错误/失礼。希望仍然可以遵循逻辑。)
虽然像前面的回答一样,我会使用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表中没有唯一的限制,因此去了子查询,因为这消除了{{1 }或DISTINCT
,因此会更好地优化。但是,如果U_ID和C_ID在User_Class中受到唯一约束,那么根据您的RDBMS使用连接可能是有益的。 SQL-Server将以几乎完全相同的方式优化两者:
总之,SQL方法可能是有益的,但您应该使用的确切SQL将取决于您的RDBMS,数据结构,指标和密钥。
答案 2 :(得分: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 & "'"
答案 3 :(得分: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