如何在c#和Sql中只执行一次查询两个相同列的表到datagridview列

时间:2014-10-16 09:45:13

标签: c# sql join datagridview

我遇到了一个奇怪的问题 我在sql数据库中有2个表 所以我想编写一个查询,给出2个表数据的结果 2个表具有相同的列名,如

admission_number
student_name
student_class 我想以给定的图像enter image description here执行该查询 执行查询后得到的数据将被加载到C#
中的win-form编码的datagridview中 我使用下面的代码来训练它,但它完全与我的问题无关,请帮助我。

 private void report()
    {
        dataGridView4.AutoResizeColumns();
        dataGridView4.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;


        ConnectionStringSettings consettings = ConfigurationManager.ConnectionStrings["smssms"];
        string connectionString = consettings.ConnectionString;
        SqlConnection cn = new SqlConnection(connectionString);

        SqlCommand sqlcmd = new SqlCommand();
        SqlDataAdapter sda = new SqlDataAdapter();
        DataTable dt = new DataTable();

        cn.Open();
        //pass query 

        sqlcmd = new
SqlCommand(@"selectt.admission_number,t.student_name,t.student_class,e.admission_number,e.student_name,e.student_class
from tenthclass_marks as t,eighth_to_ninth_marks as e ", cn);
        sda = new SqlDataAdapter(sqlcmd);
        //Fill the data in the SQL Data Adapter
        sda.Fill(dt);
        //Bind it in the DataGrid View
        dataGridView4.DataSource = dt;
        cn.Close();

    }

2 个答案:

答案 0 :(得分:4)

您的查询:

select  t.admission_number,
        t.student_name,
        t.student_class,
        e.admission_number,
        e.student_name,
        e.student_class
from    tenthclass_marks as t,
        eighth_to_ninth_marks as e 

正在生成两个表的Cartesian Product。也就是说tenthclass_marks中的每一行都与每一行eighth_to_ninth_marks组合在一起,所以如果每个表有5行,最后会有25行(5 x 5)。

您需要使用UNION ALL来合并结果:

SELECT  t.admission_number,
        t.student_name,
        t.student_class
FROM    tenthclass_marks AS t
UNION ALL
SELECT  e.admission_number,
        e.student_name,
        e.student_class
FROM    eighth_to_ninth_marks AS e;

对于你的c#值,你也可以清理一下:

private void report()
{
    dataGridView4.AutoResizeColumns();
    dataGridView4.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
    string connectionString = ConfigurationManager.ConnectionStrings["smssms"].ConnectionString;
    string sql = @"SELECT   t.admission_number,
                            t.student_name,
                            t.student_class
                    FROM    tenthclass_marks AS t
                    UNION ALL
                    SELECT  e.admission_number,
                            e.student_name,
                            e.student_class
                    FROM    eighth_to_ninth_marks AS e;";

    DataTable dt = new DataTable();     
    using (var adapter = new SqlDataAdapter(sql, connectionString))
    {
        adapter.Fill(dt);
    }
    dataGridView4.DataSource = dt;
}

答案 1 :(得分:0)

在两个表之间使用 UNION ALL

Select * from tenthclass_marks 
Union All 
Select * from eighth_to_ninth_marks