您的位置:首页 > 数据库

开发日志:SQL/HQL按外键字段排序,同时能够读取外键为null的数据

2013-10-15 10:23 204 查看
现有表

表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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: