开发日志:SQL/HQL按外键字段排序,同时能够读取外键为null的数据
2013-10-15 10:23
204 查看
现有表
表A
表B
要求:查出表A的所有数据,排序按外键的B的number排序,如果没有外键,则排最后。
如果使用
SQL:
HQL:
原表数据
查询出来的数据
无法读取出A表中外键为null的数据
解决方法,使用外联(http://blog.csdn.net/kaidishi/article/details/12747443和www.jb51.net/article/30974.htm)
SQL:
也可以使用下面的方法实现将null值放在前面/后面的效果,参考:http://blog.csdn.net/kaidishi/article/details/12651977
HQL:
查询结果
符合需求
用到的模拟表和数据
表A
表B
表A
表B
要求:查出表A的所有数据,排序按外键的B的number排序,如果没有外键,则排最后。
如果使用
SQL:
SELECT a.*,b.`number` FROM a,b WHEREa.`b_id` = b.`id` ORDER BY b.`number` ASC,a.`no` DESC
HQL:
FROM A a ORDER BY a.b.number ASC,a.`no`DESC
原表数据
查询出来的数据
无法读取出A表中外键为null的数据
解决方法,使用外联(http://blog.csdn.net/kaidishi/article/details/12747443和www.jb51.net/article/30974.htm)
SQL:
SELECT a.*,b.number FROM a LEFT JOIN b ON a.`b_id` = b.`id` ORDER BY CASE WHEN b.number IS NULL THEN 999 ELSE b.number END ASC,a.no DESC
-- 其中999为你认为b_number不可能超过的数,也可以添加参数来代替【在这用于给null的数据赋值,决定外键为null的数据的排序位置】如 DECLARE @maxNumber INT; SELECT @maxNumber =max(number)+1 FROM B ; SELECT A.id,A.b_id,B.number FROM A LEFT JOIN B ON A.b_Id = B.Id ORDER BY CASE WHEN B.number IS NULL THEN @maxNumber ELSE B.number END ASC,a.no DESC
也可以使用下面的方法实现将null值放在前面/后面的效果,参考:http://blog.csdn.net/kaidishi/article/details/12651977
SELECT a.*,b.number FROM a LEFT JOIN b ON a.`b_id` = b.`id` ORDER BY -b.number DESC,a.no DESC
HQL:
SELECT a FROM A a LEFT JOIN a.b b ORDER BY -b.number DESC,a.`no` DESC
查询结果
符合需求
用到的模拟表和数据
表A
DROP TABLE IF EXISTS `a`; CREATE TABLE `a` ( `id` int(11) NOT NULL AUTO_INCREMENT, `b_id` int(11) DEFAULT NULL, `name` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, `no` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*Data for the table `a` */ insert into `a`(`id`,`b_id`,`name`,`no`) values (1,1,'排第一',0),(2,1,'排第一',0),(3,NULL,'空值',0),(4,2,'排第二',0),(5,3,'排第三',0),(6,NULL,'空值',1),(7,3,'排第三',1),(8,4,'排第四',1),(9,5,'排第五',1);
表B
DROP TABLE IF EXISTS `b`; CREATE TABLE `b` ( `id` int(11) NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; /*Data for the table `b` */ insert into `b`(`id`,`number`) values (1,1),(2,2),(3,3),(4,4);
相关文章推荐
- SQL读取指定数据表中的所有字段说明
- SQL读取指定数据表中的所有字段说明
- 如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF
- SQL读取指定数据表中的所有字段说明
- SQL语句order by两个字段同时排序问题
- SQLServer 工具箱v1.2(SQL脚本排序,日志清除,数据导入导出)附源代码
- sql,hql等join条件字段为null时,易出现错误以及解决办法
- SQL语句order by两个字段同时排序
- SQLServer 工具箱v1.3(SQL脚本排序,日志清除,数据导入导出)附完整源代码
- sql语句中order by 多个字段同时排序的应用
- SQLServer 工具箱v1.1(SQL脚本排序,日志清除,数据导入导出)附源代码
- 一个sql语句同时实现两条数据的某个字段值交换
- SQL语句order by两个字段同时排序
- SQL语句order by两个字段同时排序。
- t-sql操作符中,不等号(!=,<>),查询出来的结果集不包含有当前字段为null的数据
- SQL语句order by两个字段同时排序
- sql server里如何查询字段值为null的数据
- SQL语句order by两个字段同时排序。
- sqlserver/oracle当插入表数据时同时修改其中一个字段的触发器
- excel如何对数据进行多字段同时排序、多条件组合和多条件筛选呢