A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© superjojo 初级黑马   /  2013-4-9 10:51  /  1573 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 superjojo 于 2013-4-10 00:32 编辑

想请教一下跨表查询的问题,按照杨老师的Ado.Net项目开发教程(第五季)里,
在Model/DAL这样的做法下,比如说数据绑定都是用实体类的,那如果我想在一张查询表里出现多张实际表的内容(表间有主键、外键的逻辑关系,但没有实际建外键),
简单举例:就比如说要显示姓名(在员工表里)和学历(博硕本专等,在T_IdName表里)
查询表是由EmployeeDAO.ListALL()获得的,而ListALL()返回的是一个员工类数组(Employee[]),可员工类里是只有学历ID而没有学历Name的,必须要跨T_IdName表通过学历ID取得学历名,,

学历不想用DataGridComboBoxColumn,而是想用DataGridTextColumn来显示,那应该怎么做?或者比如说是在网页里吧,没有这些个控件的,,。那具体应该怎么做呢?



实体类Employee里只有EducationID,具体的学历(如博、硕、本等)是放在一个T_IdName表里的,,

即是实体类Employee里只有学历的ID,具体的学历名还要根据学历ID去T_IdName表里取出来....

我刚刚学这种Model/DAL,这个跨表查询的问题好困扰....


求教,感激!!!
----------------------------------------------------------------------------------------------
补充问题:

如果我还要同时得到T_IdName 里的性别Name和 学历Name?

select p.ID, P.Name, p.GenderID, i.Name Gname ,P.EducationID  
from T_PersonTest p , T_IdName i
where ( p.GenderID = i.ID and i.category='性别' )
或者
select p.ID, P.Name, p.GenderID, i.Name Ename ,P.EducationID  
from T_PersonTest p , T_IdName i
where (  p.EducationID=i.ID and i.category='学历')

上面两种语句,可以分别得到单列性别 和单列学历 的表

可如果相在同一张表里出现
员工ID  员工Name GenderID EducationID 学历 性别 这样的表呢?

我觉得这种情况,这一张T_IdName表好难处理啊

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

8 个回复

倒序浏览
查询多个表的数据的话,建议在数据库中建一个视图吧!

评分

参与人数 1黑马币 +1 收起 理由
superjojo + 1

查看全部评分

回复 使用道具 举报
select * from [员工表] as y ,T_IdName as N where y.EducationID = N.EducationID(T_IdName 表中的学历ID)

得到的就是两张表的数据

评分

参与人数 1黑马币 +2 收起 理由
superjojo + 2

查看全部评分

回复 使用道具 举报
史鹏飞 发表于 2013-4-9 15:17
select * from [员工表] as y ,T_IdName as N where y.EducationID = N.EducationID(T_IdName 表中的学历ID ...

那如果我还要同时得到T_IdName 里的性别Name呢?

select p.ID, P.Name, p.GenderID, i.Name Gname ,P.EducationID  
from T_PersonTest p , T_IdName i
where ( p.GenderID = i.ID and i.category='性别' )

select p.ID, P.Name, p.GenderID, i.Name Ename ,P.EducationID  
from T_PersonTest p , T_IdName i
where (  p.EducationID=i.ID and i.category='学历')

上面两种语句,可以分别得到单列性别 和单列学历 的表

可如果相在同一张表里出现
员工ID  员工Name GenderID EducationID 学历 性别 这样的表呢?

我觉得这种情况,这一张T_IdName表好难处理啊
回复 使用道具 举报
本帖最后由 史鹏飞 于 2013-4-9 18:01 编辑

你的表是怎么设计的啊,有三个表吧? 员工表   学历表   性别表,
你把表结构弄个截图出来看看啊。
回复 使用道具 举报
本帖最后由 superjojo 于 2013-4-9 18:49 编辑
史鹏飞 发表于 2013-4-9 17:53
你的表是怎么设计的啊,有三个表吧? 员工表   学历表   性别表,
你把表结构弄个截图出来看看啊。 ...

只有两张表的,是按照杨中科老师的  Ado.Net项目开发教程(第五季)  里面做的

T_IdName表:把常用的基础数据(如性别、学历、政治面貌、婚姻状况等等),比较固定的值,一般不需要编辑的都记到T_IdName表里,通过Category来表示类别。。。。这个是杨中科老师的视频里教的
ID                                                                Name               Category
5A3DC838-CFBB-46BF-9917-376B8F4D6C49        女                  性别
FDF01D27-1E90-4007-98C7-60E9918A267C        本科                学历
056F676D-B616-47D1-A224-8F1857E475B9        博士                学历
A5C772C2-218A-49F0-B6C7-96A77A35870E        硕士                学历
8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        男                   性别
AF629BD2-41E1-466C-9519-AFF094044B35        未知性别           性别
83B79927-7CD6-47D8-8F73-D4C7E8278709        高中及以下        学历
94F85EEE-65AB-418E-9F01-ED86D55A293E        大专                  学历

T_PersonTest表:就是简化了的一张员工信息表,有员工ID、员工Name、性别ID、学历ID,但是具体的性别Name和学历Name要通过性别ID和学历ID去T_IdName表里获取(通过Category='性别'来取得男、女、未知性别,通过Category='学历'来取得博士、硕士、本科等)
ID                                                                 Name           GenderID                                                        EducationID
7955F1A1-7EF4-4460-B646-4DB6EDA21DFF        BoBo        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        FDF01D27-1E90-4007-98C7-60E9918A267C
D9A18273-9A9F-473E-9E2E-5EE63D2E01B1        JoJo         8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        A5C772C2-218A-49F0-B6C7-96A77A35870E
2E0643F1-FBEB-42FE-84C2-EF811D94F0D8        CiCi          5A3DC838-CFBB-46BF-9917-376B8F4D6C49        94F85EEE-65AB-418E-9F01-ED86D55A293E



现在就是想取得一张带性别Name和学历Name的表
比如
EmployeeID      EmployeeName            GenderID       GenderName        EducationID       EducatinName


回复 使用道具 举报
superjojo 发表于 2013-4-9 18:46
只有两张表的,是按照杨中科老师的  Ado.Net项目开发教程(第五季)  里面做的

T_IdName表:把常用的基础数 ...

这个写存储过程比较好
回复 使用道具 举报
本帖最后由 superjojo 于 2013-4-9 20:04 编辑
史鹏飞 发表于 2013-4-9 17:53
你的表是怎么设计的啊,有三个表吧? 员工表   学历表   性别表,
你把表结构弄个截图出来看看啊。 ...

T_IdName表:把常用的基础数据(如性别、学历、政治面貌、婚姻状况等等),比较固定的值,一般不需要编辑的都记到T_IdName表里,通过Category来表示类别。。。。
ID                                                                Name               Category
5A3DC838-CFBB-46BF-9917-376B8F4D6C49        女                  性别
FDF01D27-1E90-4007-98C7-60E9918A267C        本科                学历
056F676D-B616-47D1-A224-8F1857E475B9        博士                学历
A5C772C2-218A-49F0-B6C7-96A77A35870E        硕士                学历
8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        男                   性别
AF629BD2-41E1-466C-9519-AFF094044B35        未知性别             性别
83B79927-7CD6-47D8-8F73-D4C7E8278709        高中及以下           学历
94F85EEE-65AB-418E-9F01-ED86D55A293E        大专                  学历

T_PersonTest表:就是简化了的一张员工信息表,有员工ID、员工Name、性别ID、学历ID,但是没有性别Name和学历Name,具体要通过性别ID和学历ID去T_IdName表里获取(通过Category='性别'来取得男、女、未知性别,通过Category='学历'来取得博士、硕士、本科等)
ID                                                                  Name            GenderID                                                        EducationID
7955F1A1-7EF4-4460-B646-4DB6EDA21DFF        BoBo        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        FDF01D27-1E90-4007-98C7-60E9918A267C
D9A18273-9A9F-473E-9E2E-5EE63D2E01B1        JoJo         8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        A5C772C2-218A-49F0-B6C7-96A77A35870E
2E0643F1-FBEB-42FE-84C2-EF811D94F0D8        CiCi          5A3DC838-CFBB-46BF-9917-376B8F4D6C49        94F85EEE-65AB-418E-9F01-ED86D55A293E




如果用下面的SQL语句
select p.ID, P.Name, p.GenderID, i.Name Gname ,P.EducationID  
from T_PersonTest p , T_IdName i
where ( p.GenderID = i.ID and i.category='性别' )
可以得到
ID                                                                  Name            GenderID                                                  Gname        EducationID  
7955F1A1-7EF4-4460-B646-4DB6EDA21DFF        BoBo        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        女        FDF01D27-1E90-4007-98C7-60E9918A267C
D9A18273-9A9F-473E-9E2E-5EE63D2E01B1        JoJo        8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        男        A5C772C2-218A-49F0-B6C7-96A77A35870E
2E0643F1-FBEB-42FE-84C2-EF811D94F0D8        CiCi        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        女        94F85EEE-65AB-418E-9F01-ED86D55A293E

如果用下面的SQL语句
select p.ID, P.Name, p.GenderID, i.Name Ename ,P.EducationID  
from T_PersonTest p , T_IdName i
where (  p.EducationID=i.ID and i.category='学历')
则可以得到
ID                                                                    Name            GenderID                                                 Ename       EducatinID
7955F1A1-7EF4-4460-B646-4DB6EDA21DFF        BoBo        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        本科        FDF01D27-1E90-4007-98C7-60E9918A267C
D9A18273-9A9F-473E-9E2E-5EE63D2E01B1        JoJo        8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        硕士        A5C772C2-218A-49F0-B6C7-96A77A35870E
2E0643F1-FBEB-42FE-84C2-EF811D94F0D8        CiCi        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        大专        94F85EEE-65AB-418E-9F01-ED86D55A293E



但是,要怎么样才能得到下面这个表?(我用记事本拼出来的)想取得一张带性别Name和学历Name的表
ID                                                                 Name               GenderID                                              Gname          EducationID                                     Ename
7955F1A1-7EF4-4460-B646-4DB6EDA21DFF    BoBo        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        女        FDF01D27-1E90-4007-98C7-60E9918A267C        本科
D9A18273-9A9F-473E-9E2E-5EE63D2E01B1     JoJo        8A5032FA-6313-48E5-AAC9-A7A3D895EB9D        男        A5C772C2-218A-49F0-B6C7-96A77A35870E        硕士
2E0643F1-FBEB-42FE-84C2-EF811D94F0D8     CiCi        5A3DC838-CFBB-46BF-9917-376B8F4D6C49        女        94F85EEE-65AB-418E-9F01-ED86D55A293E        大专
回复 使用道具 举报
史鹏飞 发表于 2013-4-9 19:19
这个写存储过程比较好

谢谢!这个问题解决了

select a.ID,a.Name,b.Name,b.ID,c.Name,c.ID from T_PersonTest as a
left join T_IdName as b on a.GenderID=b.ID
left join T_IdName as c on a.EducationID=c.ID
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马