SQL一对多查询问题

2025-02-24 03:58:53
推荐回答(5个)
回答1:

select t1.学号,t1.姓名,t1.性别,t2.科目,t2.成绩 from 总表 t1,分表 t2 where t1.学号=t2.学号 order by t1.学号

另你说的跨行显示如果是值相同就合并上下两个单元格的意思的话,是可以的,要在后台写代码合并单元格。
protected void GridView2_DataBound(object sender, EventArgs e)
{
int inArA;
int inArB;
int intspan;
string temp="",temp1="";
for (inArA = 0; inArA < GridView2.Rows.Count; inArA++)
{
GridViewRow _itm = GridView2.Rows[inArA];
intspan = 1;
temp = GridView2.Rows[inArA].Cells[0].Text;

#region IP不同导致出现两条记录时,开始合并
for (inArB = inArA + 1; inArB < GridView2.Rows.Count; inArB++)
{
temp1 = GridView2.Rows[inArB].Cells[0].Text;
if (String.Compare(temp, temp1) == 0)
{
intspan++;
//GridView2.Rows[inArA].Cells[0].RowSpan = intspan;//学号合并
//GridView2.Rows[inArA].Cells[1].RowSpan = intspan;//姓名合并
//GridView2.Rows[inArA].Cells[2].RowSpan = intspan;//性别合并
GridView2.Rows[inArA].Cells[3].RowSpan = intspan;//科目不合并
GridView2.Rows[inArA].Cells[4].RowSpan = intspan;//成绩不合并

//GridView2.Rows[inArB].Cells[0].Visible = false;
//GridView2.Rows[inArB].Cells[1].Visible = false;
//GridView2.Rows[inArB].Cells[2].Visible = false;
GridView2.Rows[inArB].Cells[3].Visible = false;
GridView2.Rows[inArB].Cells[4].Visible = false;
}
else
{
break;
}
}
#endregion
inArA = inArB - 1;

}
}

希望对你有帮助

回答2:

select 学生表.学号列,学生表.姓名列,学生表.性别列,成绩表.语文列,成绩…… from 学生表,成绩表 where 学生表id = 成绩表学生id(学号).

不知道这样写你能不能看的清,好像没听说过datagridview可以跨行先显示,要是能跨行显示的话那不乱套了吗,一定要跨行吗?你把语数英并排不就完了.

下面是sql联接查询的资料希望对你有用:

数据库中有两种联接:内连接,外连接。
一、其中内连接就是一般的相等连接。
如:select * from a, b where a.id = b.id
二、外连接
对于外连接,可以分为左外连,右外连,全外连。详细介绍如下:
1. LEFT OUTER JOIN:左外关联
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);

结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。

2. RIGHT OUTER JOIN:右外关联

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);

结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。

3. FULL OUTER JOIN:全外关联

SELECT e.last_name, e.department_id, d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);

结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。

回答3:

小朋友,你的提问很整齐,也很到位,一目了然
下面是解答

select a.学号,a.姓名,a.性别,b.科目,b.成绩
from 总表 a inner join 分表 b on a.学号=b.学号

DataGridView是不能跨行的,得用别的控件,推荐devexpress的控件,不过你连这个SQL都不会写,要用那个公司的控件,记得得下点功夫。

回答4:

select 总表.学号,总表.姓名,总表.性别,分表.科目,分表.成绩
from 总表,分表
where 总表.学号=分表.学号
order by 总表.学号

显示的结果会是:
001 张三 男 语文 80
001 张三 男 数学 90
001 张三 男 英语 95
002 李四 女 语文 75
002 李四 女 数学 70

你需要在DataGridView里设置合并单元格,按照前三列学号、姓名和性别合并即可。

回答5:

select 学号,姓名,性别,科目,成绩 from 总表 t1,分表 t2 where t1.学号=t2.学号 order by t1.学号
上面是SQL命令,但你说的跨行显示,好像没法实现,至少我不知道办法。