三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
来源:互联网 发布:网络终结者p2p下载 编辑:程序博客网 时间:2024/05/17 09:01
还记得开始做机房的时候,遇到了要从一个函数中返回两个表的查询结果。当时的解决方法很“冲动”也很“无拘无束”,直接在实体类里边添加了其他表的实体,效果是达到了,但总觉得不伦不类。
现在介绍三种解决上述问题的方法(代码为VB.net,系统使用三层架构)。
题设要求:假设我现在要从卡表和学生表里返回查询信息(卡表的comment,money,status和学生表的全部信息),卡表和学生表如下:
图一 学生表
图二 卡表
方法一:视图。
比较简单,相信这种方法是最常用的了。
<span style="font-size:18px;">create view V_ CardStudent @CardNo varchar(100)asselect comment,money,status,studentNo,cardNo,studentName,sex,department,grade,stclassfrom T_Card,T_Studentwhere T_Card.userName=T_Student.userName select * from V_ CardStudentwhere cardNo=@CardNo</span>
视图的应用也要求有外键关联,尤其是当我们做增删改等操作时,这样能保证数据的一致性,避免产生脏数据。同时,这里要建立新的包含所有要返回信息的实体集。
方法二:sql联合查询。
这种方法要求表之间有外键关联,我的学生表的userName是主键,也是卡表的外键。另外,我们也需要重建一个实体集,要包含所有要求返回的信息。
<span style="font-size:18px;">联合查询sql子句:strSql = "Select c.comment,c.money,c.status From T_Card as c inner join T_Student as s on c.userName=s.userName Where (c.cardNo=@CardNo)"</span>
适用情况:如果是需要操作的表比较少,如两三个可以考虑用这种方法,但如果是要求一次返回六七个表的信息,就不太推荐了,那样的sql语句着实是一个大难题……不仅不能重用,花费的时间还不如多写几行代码。
方法三:泛型集合的“集合”。
这种方法不需要什么主外键、也不用新建实体集,原理简单,但需要用到泛型集合。
原理:我们先查找每个表的实体信息,返回一个List集合,然后把我们所需要的集合结果都添加到一个新的List中,如下(部分代码):
<span style="font-size:18px;">Dim myCardList As List(Of CardEntity) Dim myStudentList As List(Of StudentEntity) '查找卡表中的信息,放到myCardList中 strQueryCardInfo = "Select * From T_Card Where cardNo=@CardNo" Dim paraCard As SqlParameter() = {New SqlParameter("@CardNo", enCard.cardNo)} dtQueryCardInfo = sqlHelper.ExecuteSelect(strQueryCardInfo, CommandType.Text, paraCard) myCardList = CType(listHelper.convertToList(Of CardEntity)(dtQueryCardInfo), Global.System.Collections.Generic.List(Of Global.Entity.CardEntity)) '查找学生表中的信息,放到myStudentList中 strQueryStudentInfo = "Select * From T_Student Where cardNo=@CardNo" Dim paraStudent As SqlParameter() = {New SqlParameter("@CardNo", enStudent.cardNo)} dtQueryStudentInfo = sqlHelper.ExecuteSelect(strQueryStudentInfo, CommandType.Text, paraStudent) myStudentList = CType(listHelper.convertToList(Of StudentEntity)(dtQueryCardInfo), Global.System.Collections.Generic.List(Of Global.Entity.StudentEntity)) Dim myList As New List(Of Object) '建立一个新List myList.Add(myCardList) '添加myCardList myList.Add(myStudentList) '添加myStudentList Return myList</span>
这种方法的缺点就是代码量较大,也不易维护。
总结:无论哪种方法,都是需要慎重考虑去选择的,有的需要时间代价,有的需要空间代价、维护代价等。所以,当我们学会或了解了新的技术或方法时,一定要慎重分析其使用范围和优缺点,选择相对合适的方法,这样我们的程序才能更稳健、高效。
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- ORACLE实现存储过程返回查询结果集合的方法
- 查询从一个表中返回所有记录不在另外一个表中的结果集的方法
- Oracle的存储过程-返回一个查询的结果集
- 从数据库中查询一个结果集和多个结果集的方法
- MySQL中数据结果集分页功能的实现方法;数据库查询返回特定结果即分页查询
- AJAX三种返回查询结果的三种方式
- JPQL联表查询,返回结果整合联表的两个实体结果
- Hibernate的Query接口的uniqueResult()方法(如果查询结果有多个值则抛出错误;结果有且只有一个值,返回一个object; 如果没值,返回null )
- ajax实现动态从数据库模糊查询显示到下拉框中(ajax方法返回Dataset的例子)
- ajax实现动态从数据库模糊查询显示到下拉框中(ajax方法返回Dataset的例子)
- SQL 从一个sql 语句结果中(作为AS一个表) 查询结果 ;按照count排序
- Oracle的存储过程能返回一个select查询结果集吗
- oracle在查询结果中附加一列的实现方法
- 存储过程使用光标类型返回一个集合(一行或多行查询结果)
- 13.01.17 c# Linq 从查询的结果中返回指定数量的记录
- Java获取Oracle存储过程中执行查询返回的结果集
- Oracle存储过程中执行查询返回的结果集,并使用java代码调用【转】
- Android 应用隐藏标题栏和状态栏
- modify和transporting运行效率研究以及FIELD_SYMBOLS
- extern用法总结
- 散列技术-散列表的概念
- 构建基本脚本
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- linux shell学习(一)
- Unity3D之如何将包大小减少到极致
- wget命令 scp命令 rcp命令
- C++中四种强制类型转换
- makefile教程
- Ubuntu 14.04 中文输入法问题
- 利用gho镜像文件安装虚拟机系统
- 散列技术-散列函数的构造方法