【问题标题】:query the second table with the result of first使用第一个结果查询第二个表
【发布时间】:2012-11-06 12:04:13
【问题描述】:

我需要将两个表绑定到一个数据集中。我有三个名为 Student、StudentMarks 的表。

如果我知道 studentId,我可以像这样查询学生表

DataSet ds=new DataSet();

SqlCommand cmd=new SqlCommand("
SELECT * 
FROM STUDENTS
WHERE STUDENTID=1; 
SELECT *
FROM STUDENTS
WHERE STUDENTID=1");

SqlDataAdapter da=new SqlDataAdapter(cmd);
da.Fill(ds);

像这样。这样我就可以访问这两个表,例如 ds.Table[0] 和 ds.Table[1]。

但我的问题是,如果我不知道 studentid,并且如果我想查询所有学生以及他们的分数,并且我必须在两个不同的表中获取这些详细信息,我该如何获取?

如果我加入这两个表,结果将在一个表中,我不知道该怎么做,有人可以帮我吗?提前致谢。

【问题讨论】:

  • 你能解释一下检索结果后你想做什么吗?让所有 Stuundets 都有相应的标记,可以通过像 mrigesh gupta 和 Mahmoud Gamal 建议你这样的 JOIN 来完成。这将是正常的方法。为什么要两个数据集?
  • @Johannes 我需要像 ds.DataTable[0] 和 ds.DataTable[1] 一样查询 DataSet 中的 DataTables,因为在另一个中使用相同的格式(当我知道学生 ID 时)地点
  • 但是为什么呢?您可以使用一些简单的 SQL 完成所有操作。无论如何,您可以运行两个查询并将结果添加到一个数据集中,请参阅link
  • @Johannes 谢谢,我会检查一下

标签: sql sql-server-2008


【解决方案1】:

试试这个;

SELECT
  s.*
FROM STUDENTS s
INNER JOIN StudentMarks m ON s.STUDENTID = m.STUDENTID ;

SELECT
  m.*
FROM STUDENTS s
INNER JOIN StudentMarks m ON s.STUDENTID = m.STUDENTID ;

【讨论】:

  • 您只需将 S.* 替换为 s. 并将 M.* 替换为 m.
  • 这里可以再加入一张桌子吗?其名为 StudentAttendance
  • 是的,您可以添加另一个等等。结果取决于您的条件列。尝试添加另一个并检查结果。
  • @NiranjanKala 我试过了,但是顺序不对,上面的查询给出了正确的顺序
  • 好吧,我已经说过,结果取决于您为某些特定结果加入的这些表的关系和条件列...选择更适合您的答案。
【解决方案2】:

我想查询所有学生以及他们的分数,我必须 在两个不同的表中获取这些详细信息我怎样才能得到?

为什么要在两个不同的表中获取两个不同表的详细信息?

你可以JOIN两张表,但这只会给你一个像这样的集合:

SELECT
  s.*, 
  m.*
FROM STUDENTS s
INNER JOIN StudentMarks m ON s.STUDENTID = m.STUDENTID ;
-- You can add WHERE s.STUDENTID = 1 here as well; 

但是,您可以将这些连接的选择限制为 s.*m.*

【讨论】:

  • 感谢您的回复,正如我所说的在这里使用 DataSet,所以我需要一次访问学生以及他们的分数,那就是 y,这样如果我使用 ds.Table[0 ] 会给我学生表,ds.Table[1] 会给我那个学生的分数
  • @Shanish - 您可以使用我的查询来执行此操作。您将只有一个ds.Table[0],但在此表中您将有Studnetnamemark 等内容。然后您可以选择要从该表中选择的列。您无需将这些列放在两个不同的表中即可分别从中进行选择。
  • 感谢 Mahmour Gamal,我想先做这个,但我只是想知道,有两张桌子会简化我的要求,无论如何再次感谢您的回复
【解决方案3】:

您可以使用DataTable.Select() 方法获取您需要的学生ID 的行,如下所示:

for (int i = 0; i < ds.Tables[0].Rows.Count)
{
    int studentID = ds.Tables[0].Rows[i].Field<int>("StudentID");
    DataRow[] rows = ds.Tables[1].Select(string.Format("WHERE StudentID = {0}", studentID));
    //Do something with your mark rows here
}

或者您可以使用DataRelations 定义数据集中的关系:

//Add a primary key to the student table so you can search on StudentID
ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns["StudentID"] };

//Add the relationship between "StudentID" columns in each table
ds.Relations.Add(ds.Tables[0].Columns["StudentID"], ds.Tables[1].Columns["StudentID"]);

//Check if the table contains the given StudentID
if (ds.Tables[0].Rows.Contains(studentID))
{
    //Get all child rows associated with this Student ID
    DataRow[] rows = ds.Tables[0].Rows.Find(studentID).GetChildRows();
}

【讨论】:

    猜你喜欢
    • 2015-03-16
    • 2013-11-01
    • 2014-12-02
    • 1970-01-01
    • 2018-12-18
    • 2018-07-30
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    相关资源
    最近更新 更多