如何根据另一个表中的数据从一个表中获取数据

时间:2014-03-11 13:09:43

标签: c# sql sql-server web-services webmethod

我有两张桌子

 tblstudent (StudentID (PK), StudentNumber, Name & Surname)

 tblfingerprint (ID (PK), StudentID (FK), Template) 

我有一个Web服务,可以根据ID来选择模板。不过,我希望能够根据tblFingerprint中的StudentNumber而不是StudentID中的tblStudent来选择leftjoin or innerjoin?模板。

到目前为止,我有以下代码。我不确定是否需要使用[WebMethod] public Verification StuVerification(Student student) { cn.Open(); SqlCommand com = new SqlCommand("SELECT Template FROM tblFingerprint WHERE ID = '"+ student.StudentNumber + "'", cn); //SqlCommand com = new SqlCommand("SELECT Template FROM tblFingerprint WHERE ID = '" + ID + "'", cn); //com.Parameters.AddWithValue("@Template", Template); SqlDataReader sr = com.ExecuteReader(); while (sr.Read()) { Verification verification = new Verification() { StudentID = sr.GetInt32(0), StudentNumber = sr.GetString(1), Name = sr.GetString(2), Surname = sr.GetString(3), }; cn.Close(); return verification; } cn.Close(); return new Verification(); }

{{1}}

3 个答案:

答案 0 :(得分:1)

在两个表之间使用内部联接,但通常使用参数化查询

string cmdText = @"SELECT s.StudentID, s.StudentNumber, s.Name, s.Surname, f.Template 
                   FROM tblStudent s INNER JOIN tblFingerprint f
                   ON t.StudentID = f.StudentID 
                   WHERE s.StudentNumber = @numb";
SqlCommand com = new SqlCommand(cmdText, cn);
com.Parameters.AddWithValue("@numb", student.StudentNumber);

在INNER JOIN中,仅返回第二个表上具有相应记录的第一个表的记录(在您的情况下,只有在tblFingerprint表中具有相应记录的学生)
在LEFT JOIN中,返回第一个表的每个记录以及第二个表的相应值。如果任何学生在tblFingerprint中没有记录,则模板字段将为空

另请注意,您尝试从datareader中读取4个字段,但实际查询仅包含“模板”字段。因此,我在您的查询中添加了缺少的字段

答案 1 :(得分:0)

首先,如果您对自己进行了一些搜索,您会发现数千页有相关信息。

OT:你可以加入表格

SELECT Template FROM tblFingerprint WHERE ID = '"+ student.StudentNumber + "'


SELECT Template 
FROM tblFingerprint F
INNER JOIN tblStudent S
ON F.StudentID = S.StudentID
WHERE S.StudentNumber = '"+ student.StudentNumber + "'"

提示:使用参数,在此示例中存在SQL注入的主要风险

答案 2 :(得分:0)

JOIN相当于SQL Server上的INNER JOIN,所以只需使用以下内容即可。我已经在表名中添加了别名,以减少它的冗长。

我基于你的例子,所以我必须假设StudentNumber是一个字符串字段。如果没有,那么只需从查询中删除字符串分隔符。

"SELECT Template FROM tblFingerprint fp 
JOIN tblstudent s ON fp.StudentID = s.StudentID
WHERE s.StudentNumber = '"+ student.StudentNumber + "'"

希望这会有所帮助。 人